假设我有进程 A,它生成进程 B,进程 B 生成进程 C。在什么情况下杀死 A 会杀死整个链(或我猜的树),什么时候不会?我有时发现确实如此,有时 B 最终以 ppid 1 结束,而 C 未受影响。
此行为在特定 Linux 内核版本之间是否有所不同?
答案1
系统kill()
调用和kill
shell 命令可用于终止进程或进程组。无论哪种方式,都不存在“级联”。
当
kill()
系统调用或kill
shell命令给出一个正整数时,这代表一个进程。信号被发送到该进程而不是其他进程。当
kill()
系统调用被赋予负整数或shell 命令被赋予以(例如或)kill
开头的作业标识符时,信号会同时发送到 a 的所有成员。%
%1
%2
进程组。进程组是一项作业控制功能。在交互式 shell 使用中,每个 shell 管道(如sed s/foo/bar/ | cat -n | gzip
)由 1 个或多个进程组成,这些进程都是同一进程组的一部分。
(对于系统调用,有一些额外的情况:-1
发送给每个进程,0
发送给你自己)。
这并不意味着当一个进程死亡时,另一个进程不会因为其他原因而死亡。例如:
- 生成子进程的进程可能会拦截终止信号,并将其传递给它在退出之前创建的子进程,作为自身清理的一种方式。
- 当 shell 管道中较早的进程(例如上面的进程)死亡(由于任何原因)时,shell 管道中较晚的进程通常也会立即终止,因为它们不再接收任何输入。
内核根本不对这种“额外”后果负责,它们取决于所涉及的软件的行为方式。