【问题标题】:SIGKILL init(PID=1) without sudo? Bug in linux?SIGKILL init(PID=1) 没有 sudo? Linux中的错误?
【发布时间】:2015-10-05 17:04:51
【问题描述】:

我尝试运行以下命令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() 被实现为一个库函数,它使 调用 kill(-pgrp, sig)。

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

-1 的 PID 是特殊的;它表示除kill之外的所有进程 进程本身并初始化。

现在的问题是,这样一个字面上会杀死一切的调用有什么用。它有许多危险的应用程序,而不是有用的应用程序。但是既然这么多年一直保存在linux内核中,那么它一定有它自己的用处。但我什么都想不出来。有人知道吗?

【问题讨论】:

  • If pgrp is 0, killpg() sends the signal to the calling process's process group. (POSIX says: If pgrp is less than or equal to 1, the behavior is undefined.
  • 我错过了手册页上的那一行。这提醒我,在得出任何结论之前,我应该阅读手册页两次。 :)
  • 您不会以 root 身份进行测试,不是吗?
  • 不,绝对不是。我什至在虚拟机上运行它,它会杀死所有进程并注销当前用户。

标签: c linux system-calls


【解决方案1】:

来自killpg 的 Linux 手册页:

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

来自kill 的 Linux 手册页:

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

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

【讨论】:

  • 但如果您在发送信号之前进行交叉检查会不会更好。这将防止系统受到影响,因为运行代码会注销用户帐户。
  • @PinkeshBadjatiya “你”是谁?
  • “你”是指系统调用kill的实际代码。我的意思是,如果我们在代码本身中进行验证并且如果 PID==1 则不允许发出信号,那么这将防止系统崩溃。
  • @PinkeshBadjatiya 没有系统崩溃,并且系统调用没有做错任何事情。 kill 系统调用没有得到 pid==1,它得到 pid==-1,并且它完全按照它在这种情况下的记录做。 killpg 也完全按照 它的 文档记录去做,虽然它的作用有点可疑,但它与 POSIX 兼容。
  • @PinkeshBadjatiya 请不要那样做。如果您有新问题,请发布新问题。尽管在这种情况下,我不认为您的后续问题是 SO 的好材料。
【解决方案2】:

来自手册页:

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

因此,如果您这样做,则不能依赖任何特定行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    相关资源
    最近更新 更多