我是内核模块的新手。使用等待队列,我阻塞线程,直到缓冲区有数据。使用hrtimer
,我会定期唤醒队列。现在,问题是我删除内核模块后,我发现进程"thread1"
仍然在运行。我认为问题是等待队列永远等待,并且进程在这里被阻止。请帮我解决当我移除模块时如何终止等待队列。
void thread1(void)
{
while (thread_running) {
...
wait_event_interruptible(wait_queue, does_buffer_have_data());
...
}
}
答案 0 :(得分:4)
在内核线程中等待的常用方法:
void thread1(void)
{
while(!kthread_should_stop())
{
...
wait_event_interruptible(wait_queue,
does_buffer_have_data() || kthread_should_stop());
if(kthread_should_stop()) break;
...
}
}
void module_cleanup(void)
{
kthread_stop(t);
}
函数kthread_should_stop
检查当前线程的stop
标志。
函数kthread_stop(t)
为线程stop
设置t
标志,中断该线程执行的任何等待,并在线程完成时等待。
注意,当kthread_stop
中断等待时,不会为该线程设置任何待处理信号。
由于可中断的等待事件(wait_event_interruptible
等)在-EINTR
之后不会返回kthread_stop
,而只会重新检查条件。
因此,如果等待事件想要在kthread_stop
之后返回,那么它应该明确地检查stop
标志。