为什么在 Mac 上 kill -9 0 只会杀死 bash shell?

为什么在 Mac 上 kill -9 0 只会杀死 bash shell?

我想看看当我尝试终止进程时会发生什么kernel_task。由于kill -9 pid是强制退出进程的命令,并且kernel_task的 pid 为 0,所以我只需运行kill -9 0

在终止 root 进程时,你不会得到Permission Denied或,而是只会得到以下内容:Operation not permitted

Last login: Thu Jun 18 16:55:10 on ttys005
MacBook-Air:~ james$ kill -9 0

[Process completed]

...这很奇怪,因为尝试杀死launchd(低一个级别kernel_task)会给你带来以下结果:

-bash: kill: (1) - Operation not permitted

以及所有其他根进程。

它为什么只是终止调用该命令的进程,而不是Operation not permitted像所有其他根进程一样发送?

如果您能告诉我这个问题的答案,我将获得加分:如果您创建一个试图终止kernel_task(并忽略SIGTERM)的脚本,则运行它将输出Killed: 9并返回到 bash。为什么它在终止时将其放入 stdout?为什么不提供更具描述性的内容?

答案1

并且kernel_taskpid 是 0

他们可能使用 PID 0,因为它是一个保留的 PID,因此您无法向该进程发送信号。

我就直接跑了kill -9 0

*nix 命令kill或多或少是系统kill调用. 从系统调用的文档中:

If pid is zero:
      Sig is sent to all processes whose group ID is equal to the process group ID of the sender, and
      for which the process has permission; this is a variant of killpg(2).

换句话说,就您而言,kill -9 0这只是一种向自身发送(致命)信号的奇特方式。(有关进程组的更多信息。

为什么它只是终止调用命令的进程

(除非您调整了 shell 设置)是内置的 shell命令kill。换句话说,shell 调用 syscall kill,这会导致其自我终止。

尝试使用外部kill命令,例如/bin/kill -9 0。在这种情况下,只有/bin/kill会被杀死。

相关内容