如何杀死内核模块中的等待队列?

时间:2016-02-09 15:57:16

标签: c linux-kernel kernel-module

我是内核模块的新手。使用等待队列,我阻塞线程,直到缓冲区有数据。使用hrtimer,我会定期唤醒队列。现在,问题是我删除内核模块后,我发现进程"thread1"仍然在运行。我认为问题是等待队列永远等待,并且进程在这里被阻止。请帮我解决当我移除模块时如何终止等待队列。

void thread1(void)
{
    while (thread_running) {
        ...
        wait_event_interruptible(wait_queue, does_buffer_have_data());
        ...
    }
}

1 个答案:

答案 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标志