【问题标题】:Allowing /sbin/init be SIGSTOPed?允许 /sbin/init 被 SIGSTOP?
【发布时间】:2010-11-10 13:13:53
【问题描述】:

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

我尝试告诉内核我想用ioctl() 接收SIGSTOP(类似于main() 中的SIGABRTSIGSEGV reqs):

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

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

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

如何告诉内核我想让 init STOPPED?

【问题讨论】:

  • 也许您可以解释一下您要达到的目标是什么?

标签: linux linux-kernel signals init sigkill


【解决方案1】:

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

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

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

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


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

【讨论】:

  • 感谢您的回答。我可以从 init 的源代码中更改任务结构并重新编译它,还是更改需要提到的内核模块方法?我知道停止 init 会导致正常的影响。我需要为特定情况启用此功能,无论如何最终都会导致重新启动。
  • 我已经在上面阐明了这一点(这是一个内核结构)。
猜你喜欢
  • 2020-03-14
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2020-09-10
  • 2020-07-26
  • 2021-11-15
相关资源
最近更新 更多