C 内核中是否有一种方法可以像“kill-9”一样杀死内核kthread?
基本上,我已经使用C 内核中是否有一种方法可以像“kill-9”一样杀死内核kthread?,c,linux,linux-kernel,C,Linux,Linux Kernel,基本上,我已经使用kthread\u create()创建了一个内核线程。kthread重复执行某些操作 while() { //do something msleep_interruptible(1000); } 同时,我想在达到某个条件(例如,调用某个特定的系统调用,或终止某个特定的用户空间进程)时终止这个kthread。我已经通读了,但只找到了kthread\u stop(),它不像kill-9。它所做的只是在KTHREAD->flag中设置KTHREAD\u SHOUL
kthread\u create()
创建了一个内核线程。kthread重复执行某些操作
while() {
//do something
msleep_interruptible(1000);
}
同时,我想在达到某个条件(例如,调用某个特定的系统调用,或终止某个特定的用户空间进程)时终止这个kthread。我已经通读了,但只找到了kthread\u stop()
,它不像kill-9
。它所做的只是在KTHREAD->flag
中设置KTHREAD\u SHOULD\u STOP
位,在KTHREAD函数体中,必须调用KTHREAD\u SHOULD\u STOP()
来查询该位并单独调用do\u exit()
我试过下面这种方法。问题是当调用kthread\u stop()
时,kthread通常处于睡眠状态(即msleep\u interruptable(1000)
)。因此,我总是观察到调用kthread\u stop()
和kthread真正退出之间的延迟。这在我的项目中导致了无法忍受的延迟。我想要的就像是kill-9
,也就是说,在我调用kthread\u stop()
之后,kthread将立即终止。以及实现这一点的想法
while(!kthread_should_stop()) {
//do something
msleep_interruptible(1000);
}
我已经找到了解决我问题的办法。这不是因为睡眠(即
msleep\u可中断(1000)
)。实际上,此函数允许中断,并且kthread\u stop()
还执行wake\u up\u process()
以在设置kthread\u SHOULD\u stop
后唤醒目标kthread。因此理想情况下不应该有任何问题,这意味着无论msleep\u interruptable()
的参数是什么,只要调用kthread\u stop()
,都应该很快唤醒并终止kthread
然而,有一个“失去唤醒”的比赛条件(我得到了启发,这表明了一个非常类似的问题,我)。棘手的是msleep\u interruptable()
实际上包含两个方法,set\u current\u state(TASK\u interruptable)代码>和计划超时()代码>,并且kthread\u stop()
可以在这两个方法之前执行。因此,订单将如下所示:
[kthread]: //do something
[my syscall]: wake_up_process(kthread); //inside kthread_stop()
[kthread]: set_current_state(TASK_INTERRUPTIBLE);
[kthread]: schedule_timeout();
因此,kthread将忽略唤醒进程()。要解决这个问题,必须解耦设置当前状态(任务可中断)代码>和计划超时()代码>。到目前为止,以下代码运行良好
while(!kthread_should_stop()) {
//do something
set_current_state(TASK_INTERRUPTIBLE);
if (kthread_should_stop()) {
break;
}
schedule_timeout();
}
从这个意义上讲,内核中确实存在一种杀死kthread的方法,就像kill-9
一样,您应该将解决方案作为答案发布,而不是将其包含在问题中。(发布甚至接受你自己问题的答案是完全可以接受的,甚至是被鼓励的。)@KeithThompson谢谢你的建议。我已将我的答案从问题中删除,并将其作为答案发布。