代码之家  ›  专栏  ›  技术社区  ›  Tuminoid

允许/sbin/init被SIGSTOPed?

  •  0
  • Tuminoid  · 技术社区  · 14 年前

    我知道/sbin/init对来自内核的SIGKILL和SIGSTOP有特殊的保护,原因很明显。

    我试着告诉内核我想用ioctl()接收SIGSTOP(类似于main()中的sigabt和SIGSEGV reqs):

    if (ioctl (0, KDSIGACCEPT, SIGSTOP) == 0) {
        nih_signal_set_handler (SIGSTOP, stop_handler);
    

    但是STOP并没有到达STOP_handler()(据我所知,nih_error()没有在日志中打印)。

    在stop_handler()中,我将stop sighandler重置为SIG_DFL(否则它无论如何都会返回到我们的处理程序),但这可能会导致它再次被内核忽略。

    如何告诉kernel我想停止init?

    1 回复  |  直到 14 年前
        1
  •  2
  •   MarkR    14 年前

    你需要从它的任务结构的信号结构的标志中取出信号不确定的标志。

    您可以编写一个内核模块,它将插入init的task struct来更改它,然后您可以向init发送一个停止信号。

    不过,向init发送停止信号是一个非常糟糕的主意,因为如果init不再捕获僵尸,僵尸会迅速扩散。


    澄清:这是内核中的结构,不是in it源代码的一部分,也不能从用户空间访问或看到。要更改它,您需要编写一些内核代码或修补内核。我想,编写一个内核模块来破解它是相当简单的。