[英]How to ignore SIGKILL or force a process into 'D' sleep state?
我试图弄清楚如何让进程忽略SIGKILL。 我理解它的方式,这通常是不可能的。 我的想法是让一个进程永久进入'D'状态。 我想这样做是为了测试目的(角落的情况不是真的可重复)。 我不确定这是可能的编程(我不想破坏硬件)。 我在使用C ++和Python,但任何语言都应该没问题。 我有root权限。
我没有任何代码可以显示,因为我不知道如何开始这个,或者甚至可能。 我可以设置一个糟糕的NFS并尝试从中读取吗?
如果这是一个重复的问题,请提前道歉; 我没有发现其他人试图诱导D状态。
非常感谢。
要使进程进入“D”状态(不间断睡眠),您必须编写执行该操作的内核代码,然后通过系统调用从用户空间调用该代码。
在Linux内核中,这是通过将当前任务状态设置为不可中断并调用调度程序来完成的:
set_current_state(TASK_UNINTERRUPTIBLE);
schedule();
当然,这些操作通常包含额外的准备工作,以便任务有一种唤醒方式,例如注册一些等待队列或其他任何事情。
用于低延迟设备(如大容量存储)的设备驱动程序使用不间断睡眠来简化其逻辑。 它只应在有一个确定的方式时使用,即无论发生什么,该过程几乎都会被唤醒。
执行不间断睡眠这样的小内核的内核代码可以放入一个小模块(以最小的驱动程序框架开始),其初始化函数执行代码然后返回非零。 然后,您可以使用insmod
运行代码,例如
insmod my_uninterruptible_sleep_mod.ko
没有必要rmmod
因为函数失败,所以模块立即卸载。
无法忽略SIGKILL
或以任何方式处理它。
从man sigaction
:
在
act
指定的sa_mask
字段不允许阻止SIGKILL
或SIGSTOP
。 任何这样做的尝试都会被默默地忽略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.