我尝试运行以下命令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内核中,它必须有自己的用处。但我无法弄明白。有人知道吗?
答案 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,则行为未定义。)
如果你这样做,你就不能依赖任何特定的行为。