我知道/ 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?
答案 0 :(得分:2)
你需要从其任务结构的signal_struct标志中取出SIGNAL_UNKILLABLE标志。
默认情况下(即始终在未修改的Linux系统上),在init的signal_struct标志上设置SIGNAL_UNKILLABLE标志。
你可以编写一个内核模块,它会调用init的任务结构来改变它,然后你就可以向init发送一个停止信号。
向init发送停止信号是一个非常糟糕的主意,因为如果init不再收获它们,僵尸会迅速扩散。
澄清:这是一个内核结构,不是init源代码的一部分,也不是用户空间可访问或可见的。要更改它,您需要编写一些内核代码或修补内核。我想,编写一个只是破解它的内核模块将是相当微不足道的。