据我了解,SIGKILL 无法被捕获。这意味着进程在操作系统销毁它之前没有时间杀死它的子进程。这可以通过 shell 脚本来演示。
#! /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 的方式类似。
此外,shell 可能会在退出时向其某些子级发送 SIGHUP(请参阅disown
某些 shell 来禁用它)
答案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 连接。
shell 等程序创建新的进程组,通常将相关的子进程放入一个组中。每个作业都是一个进程组。在内核外部,shell 通过使用killpg 系统调用向作业的进程组发送信号来操作作业,该系统调用向进程组中的所有进程发送信号。
答案3
首先,我无法使用 .mplayer 重现终端被杀死后幸存的 mplayer xterm
。
它死亡的原因是它因父母的死亡而发出叹息。