1

我知道/sbin/initSIGKILL出于明显的SIGSTOP原因对内核有特殊的保护。

我已经尝试告诉内核我想要接收SIGSTOPioctl()类似于main() 中的SIGABRTSIGSEGVreqs):

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

SIGSTOP没有到达stop_handler()(据我所知,因为nih_error()没有打印在日志中)。

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

我如何告诉内核我想让 init 停止?

4

1 回答 1

2

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

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

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

不过,向 init 发送停止信号是一个非常糟糕的主意,因为如果 init 不再收割僵尸,僵尸将迅速繁殖。


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

于 2010-11-10T15:24:45.833 回答