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

时间:2014-07-23 22:34:03

标签: python c++ linux

我想弄清楚如何让进程忽略SIGKILL。我理解它的方式,这通常是不可能的。我的想法是让一个进程永久进入'D'状态。我想这样做是为了测试目的(角落的情况不是真的可重复)。我不确定这是可能的编程(我不想破坏硬件)。我在使用C ++和Python,但任何语言都应该没问题。我有root权限。

我没有任何代码可以展示,因为我不知道如何开始这个,或者甚至可能。我可以设置一个糟糕的NFS并尝试从中读取吗?

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

非常感谢。

2 个答案:

答案 0 :(得分:7)

要进入" D" state(不间断睡眠),你必须编写执行该操作的内核代码,然后通过系统调用从用户空间调用该代码。

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

set_current_state(TASK_UNINTERRUPTIBLE);
schedule();

当然,这些操作通常包含额外的准备工作,以便任务有一种唤醒方式,例如在某些等待队列上注册等等。

大容量存储等低延迟设备的设备驱动程序使用不间断睡眠来简化其逻辑。它只应在有一种确定的方式时使用,即无论发生什么,该过程几乎都会被唤醒。

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

 insmod my_uninterruptible_sleep_mod.ko

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

答案 1 :(得分:4)

无法忽略SIGKILL或以任何方式处理它。

来自man sigaction

  

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