我是内核模块的新手。使用等待队列,我阻塞线程,直到缓冲区有数据。使用hrtimer
,我定期唤醒队列。现在,问题是即使在我删除内核模块之后,我也可以看到该进程"thread1"
仍在运行。我认为问题在于等待队列永远等待并且进程在这里被阻塞。请帮助我,当我删除模块时如何终止等待队列。
void thread1(void)
{
while (thread_running) {
...
wait_event_interruptible(wait_queue, does_buffer_have_data());
...
}
}
常见的等待方式kernel thread:
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
checks stop
当前线程的标志。
功能kthread_stop(t)
sets stop
线程标志t
,中断此线程执行的任何等待,并在线程完成时等待。
请注意,虽然kthread_stop
中断等待,它不设置任何待处理信号对于线程。
因为可中断等待事件 (wait_event_interruptible
所以)不会返回-EINTR
刚过kthread_stop
但仅重新检查状况。
So, if 等待事件想要在之后返回kthread_stop
, 它应该check stop
明确标记条件.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)