我的退出功能如下:
static void __exit kMeter_exit(void){
printk(KERN_INFO "kMeter: Requesting thread stop\n");
if (task)
kthread_stop(task);
printk(KERN_INFO "kMeter: Leaving Kernel Module\n");
}
我的线程功能如下所示:
static int mainTask(void* data)
{
bool allDone;
allow_signal(SIGKILL);
set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop())
{
set_current_state(TASK_RUNNING);
allDone = mainLoop();
set_current_state(TASK_INTERRUPTIBLE);
if (allDone)
msleep_interruptible(poll_interval*1000);
else
usleep_range(TICK_TIME, TICK_TIME+100);
}
return 0;
}
问题在于,当我调用rmmod
时,线程没有从睡眠中唤醒,所以我一直卡在那里直到超时发生。根据设置,超时可能长达5分钟。我认为kthread_stop()
应该唤醒相关的线程,我认为msleep_interruptible
被允许唤醒发生。我错过了什么?