SIGKILL을 받은 후 터미널 에뮬레이터는 어떻게 하위 프로세스를 종료합니까?

SIGKILL을 받은 후 터미널 에뮬레이터는 어떻게 하위 프로세스를 종료합니까?

내가 아는 한 SIGKILL은 잡을 수 없습니다. 이는 운영 체제가 프로세스를 파괴하기 전에 해당 프로세스가 하위 프로세스를 종료할 시간이 없다는 것을 의미합니다. 이는 쉘 스크립트를 통해 시연할 수 있습니다.

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

SIGKILL로 종료하면 mplayer가 계속 실행됩니다.

$ kill -9 $pid

그러나 터미널 에뮬레이터(xterm, 터미널 등)를 사용하면 해당 하위 프로세스도 함께 종료됩니다. 어떻게 이럴 수있어?

$ mplayer

그리고 그것을 죽여라:

$ kill -9 $terminal_pid

mplayer도 침몰했습니다. 터미널 에뮬레이터가 어떻게든 SIGKILL을 포착하고 있나요? 아니면 다른 힘이 작용하고 있나요?

답변1

이에 의해 시작된 프로세스는 xterm터미널을 제어하는 ​​세션 리더가 됩니다.

터미널이 사라지면 프로세스는 자동으로 SIGHUP 신호(다음에 SIGCONT)를 수신합니다. 이는 CTRL-C를 눌렀을 때 프로세스가 SIGINT를 수신하는 방식과 유사한 방식으로 커널에 의해 전송됩니다.

또한 쉘은 종료 시 일부 하위 항목에 SIGHUP을 보낼 수 있습니다( disown이를 비활성화하려면 일부 쉘 참조).

답변2

귀하의 질문에는 답변 자체가 있습니다. 이는 이러한 프로세스가 터미널 에뮬레이터에서 하위 프로세스로 실행되기 때문에 발생합니다. 따라서 터미널 에뮬레이터를 종료하고 프로세스의 모든 하위 프로세스를 종료합니다(하위 프로세스는 제어 터미널 에뮬레이터와 동일한 프로세스 그룹에서 실행되기 때문입니다).

예를 들어 다음을 참조하세요.

csb@darwin[~]$ ps fauwx | grep -A6 "xfce4-terminal" | awk '{ for (i = 2; i <= 9; i++) $i="" ; print $0 }' 
csb         0:32 xfce4-terminal --geometry=271x65 --display :0.0 --role=Terminal-0x1340050-2606-1351620352 --show-menubar --show-borders --hide-toolbars --working-directory /home/csb --tab --working-directory /home/csb
csb         0:00 \_ gnome-pty-helper
csb         0:00 \_ bash
csb         0:00 | 
                  \_ ssh [redacted]
csb         0:00 \_ bash
csb         0:00 \_ ps fauwx
csb         0:00 \_ grep --color=auto -A6 xfce4-terminal
csb         0:00 \_ awk { for (i = 2; i <= 9; i++) $i="" ; print $0 }

이러한 모든 프로세스는 "xfce4-terminal" 프로세스에서 실행되므로 해당 프로세스를 종료하면 프로세스 그룹의 모든 하위 프로세스가 자동으로 종료됩니다. 같은 방식으로 예를 들어 터미널 에뮬레이터 창을 종료하면 종료되어야 합니다. 나 SSH 연결.

셸과 같은 프로그램은 새로운 프로세스 그룹을 생성하며 종종 관련 하위 프로세스를 그룹에 배치합니다. 각 작업은 프로세스 그룹입니다. 커널 외부에서 쉘은 프로세스 그룹의 모든 프로세스에 신호를 보내는 killpg 시스템 호출을 사용하여 작업의 프로세스 그룹에 신호를 보내 작업을 수행합니다.

답변3

첫째, .mplayer를 사용하여 터미널 kill에서 살아남은 mplayer를 재현할 수 없습니다 xterm.

죽음의 이유는 부모의 죽음을 안타까워하기 때문이다.

관련 정보