终端模拟器如何在收到 SIGKILL 后杀死其子进程?

终端模拟器如何在收到 SIGKILL 后杀死其子进程?

据我了解,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

它死亡的原因是它因父母的死亡而发出叹息。

相关内容