允许/ sbin / init被SIGSTOPed?

时间:2010-11-10 13:13:53

标签: linux kernel signals init ioctl

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

我试过告诉内核我希望用ioctl()接收SIGSTOP(类似于main()中的SIGABRT和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(否则它会回到我们的处理程序中),但这可能导致它再次被内核忽略。

如何告诉内核我想要初始化STOPPED?

1 个答案:

答案 0 :(得分:2)

你需要从其任务结构的signal_struct标志中取出SIGNAL_UNKILLABLE标志。

默认情况下(即始终在未修改的Linux系统上),在init的signal_struct标志上设置SIGNAL_UNKILLABLE标志。

你可以编写一个内核模块,它会调用init的任务结构来改变它,然后你就可以向init发送一个停止信号。

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


澄清:这是一个内核结构,不是init源代码的一部分,也不是用户空间可访问或可见的。要更改它,您需要编写一些内核代码或修补内核。我想,编写一个只是破解它的内核模块将是相当微不足道的。