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谢谢你的建议。我已将我的答案从问题中删除,并将其作为答案发布。