没有sudo的SIGKILL init(PID = 1)? linux中的错误?

时间:2015-10-05 17:04:52

标签: c linux system-calls

我尝试运行以下命令kill -9 1,并说bash: kill: (1) - Operation not permitted

对我来说很明显,你不应该在没有sudo的情况下发出init进程的信号。

但是在为c-shell编写代码时我遇到了一个错误(我认为确实如此)。我编译了以下程序并运行它。现在它让我和我所有的操作系​​统概念混淆了。

#include <signal.h>
int main()
{
    killpg(1,9);
    return (0);
}
  

请保存所有程序并自行运行代码。

任何人都可以给我一个理由并澄清我的困惑。

更新
killpg()的手册页读作...

  

在Linux上,killpg()是作为库函数实现的   叫杀(-pgrp,sig)。

kill()的手册页读作...

  

PID为-1是特殊的;它表示除kill之外的所有进程   处理本身和init。

现在的问题是,这样一个字面上杀死一切的电话的用途是什么。它有许多危险的应用程序而不是有用的应用程序。但是,自从多年以来它一直保存在Linux内核中,它必须有自己的用处。但我无法弄明白。有人知道吗?

2 个答案:

答案 0 :(得分:6)

来自killpg的Linux手册页:

  

在Linux上,killpg()实现为调用kill(-pgrp, sig)的库函数。

来自kill的Linux手册页:

  

如果pid等于-1,则sig将被发送到调用进程有权发送信号的每个进程,但进程1(init)除外

因此,您遇到了一个特殊情况,其中killpg(1, 9)实际上并不意味着将SIGKILL发送到pgrp 1,而是将SIGKILL发送到{1}}由于实施的怪癖,它有权获得的一切。正如其他人所指出的那样,当第一个参数为1时,POSIX没有指定killpg的行为,所以这可能不是一个错误。

答案 1 :(得分:3)

从手册页:

  

(POSIX说:如果pgrp小于或等于1,则行为未定义。)

如果你这样做,你就不能依赖任何特定的行为。