如何忽略 SIGKILL 或强制进程进入“D”睡眠状态?

Posted

技术标签:

【中文标题】如何忽略 SIGKILL 或强制进程进入“D”睡眠状态?【英文标题】:How to ignore SIGKILL or force a process into 'D' sleep state? 【发布时间】:2014-07-23 22:34:02 【问题描述】:

我试图弄清楚如何让进程忽略 SIGKILL。按照我的理解,这通常是不可能的。我的想法是让进程永久进入“D”状态。我想这样做是出于测试目的(极端情况并不是真正可重现的)。我不确定这是否可以通过编程方式实现(我不想损坏硬件)。我正在使用 C++ 和 Python,但任何语言都应该没问题。我有 root 访问权限。

我没有任何代码要显示,因为我不知道如何开始使用它,或者它是否可能。我可以设置一个错误的 NFS 并尝试从中读取吗?

如果这是重复的问题,请提前道歉;我没有发现其他人试图诱导 D 状态。

非常感谢。

【问题讨论】:

【参考方案1】:

要让进程进入“D”状态(不间断睡眠),您必须编写执行此操作的内核代码,然后通过系统调用从用户空间调用该代码。

在 Linux 内核中,这是通过将当前任务状态设置为不可中断并调用调度程序来完成的:

set_current_state(TASK_UNINTERRUPTIBLE);
schedule();

当然,这些操作通常包含额外的准备工作,以便任务有办法唤醒,例如在某个等待队列上注册或其他什么。

低延迟设备(例如大容量存储)的设备驱动程序使用不间断睡眠来简化其逻辑。它应该只在有确定的方式时使用,该方法几乎不管发生什么都会唤醒进程。

可以将用于执行不间断睡眠之类的小事情的内核代码放入一个小模块(从最小的驱动程序框架开始),其初始化函数执行代码,然后返回非零值。然后您可以使用insmod 运行代码,例如

 insmod my_uninterruptible_sleep_mod.ko

不需要rmmod,因为函数失败,所以模块立即卸载。

【讨论】:

【参考方案2】:

不可能忽略SIGKILL或以任何方式处理它。

来自man sigaction

act 中指定的sa_mask 字段不允许阻塞SIGKILLSIGSTOP。任何这样做的尝试都会被忽略。

【讨论】:

我会说同样的话,真的。 好的,我认为我的问题措辞不当。我以为 D 状态的进程在改变状态之前不会响应 SIGKILL? 您的程序无法处理这些信号。操作系统的行为超出了您的控制范围。 @yourfavoriteprotein:但是你的进程在 D 状态下什么都做不了。 创建一个 RAM 非常少但 SWAP 非常大(几乎是可用磁盘空间的一半)的系统。然后让您的进程分配几乎所有可以分配的虚拟内存(占用几乎所有的 RAM 和 SWAP 组合)。走那段记忆,在其中写入随机值。然后,诱导出一个核心文件。这不会导致永久的D状态,但会花费很长时间。

以上是关于如何忽略 SIGKILL 或强制进程进入“D”睡眠状态?的主要内容,如果未能解决你的问题,请参考以下文章

从 pthread 调用 sleep() 是不是会使线程进入睡眠状态或进程?

如何检测是不是有任何进程阻止 Windows 进入睡眠状态?

linux信号 SIGINT SIGTERM SIGKILL

当我的 Mac 进入睡眠状态时,我的应用程序会发生啥?

UNP学习第五章

【kill】kill -9 杀不死的进程处理办法