Linux 中如何杀死级联?

Linux 中如何杀死级联?

假设我有进程 A,它生成进程 B,进程 B 生成进程 C。在什么情况下杀死 A 会杀死整个链(或我猜的树),什么时候不会?我有时发现确实如此,有时 B 最终以 ppid 1 结束,而 C 未受影响。

此行为在特定 Linux 内核版本之间是否有所不同?

答案1

系统kill()调用和killshell 命令可用于终止进程或进程组。无论哪种方式,都不存在“级联”。

  • kill()系统调用或killshell命令给出一个正整数时,这代表一个进程。信号被发送到该进程而不是其他进程。

  • kill()系统调用被赋予负整数或shell 命令被赋予以(例如或)kill开头的作业标识符时,信号会同时发送到 a 的所有成员。%%1%2进程组。进程组是一项作业控制功能。在交互式 shell 使用中,每个 shell 管道(如sed s/foo/bar/ | cat -n | gzip)由 1 个或多个进程组成,这些进程都是同一进程组的一部分。

(对于系统调用,有一些额外的情况:-1发送给每个进程,0发送给你自己)。

这并不意味着当一个进程死亡时,另一个进程不会因为其他原因而死亡。例如:

  • 生成子进程的进程可能会拦截终止信号,并将其传递给它在退出之前创建的子进程,作为自身清理的一种方式。
  • 当 shell 管道中较早的进程(例如上面的进程)死亡(由于任何原因)时,shell 管道中较晚的进程通常也会立即终止,因为它们不再接收任何输入。

内核根本不对这种“额外”后果负责,它们取决于所涉及的软件的行为方式。

相关内容