3
我注意到内核模块中的一些奇怪的行为。当我运行下面的代码(带有等待队列)。 finish_wait()之后,printk()不会显示在内核日志中。 第5行也只打印一次。任何想法是怎么回事?linux内核等待队列 - printk不在消息日志中显示
DEFINE_WAIT(wait);
DECLARE_WAIT_QUEUE_HEAD(wait_q);
flags |= O_NONBLOCK;
while ((err = kthread->sock->ops->accept(kthread->sock, kthread->sock_send, flags)) < 0){
printk("%s: before prepare_to_wait err = -%d\n", __func__,err);
prepare_to_wait(&wait_q, &wait, TASK_INTERRUPTIBLE);
if(kthread_should_stop()){
printk("%s: killing thread\n", __func__);
msleep(1000);
finish_wait(&wait_q, &wait);
goto close_and_out;
}
schedule();
}
finish_wait(&wait_q, &wait);
printk("after finish wait: This doesn't show up in kernel logs...\n");
如果其他'printk's正在这时,我怀疑是控制从来没有到达最后'printk'。在这里有很多方法,控制可能不会来到你想要的'printk' - 一个无限的'while'循环,通过'schedule','goto'语句放弃控制。 –
此代码位于无限循环内。一切似乎都很好,这很奇怪。这是一台网络服务器,一切似乎都正常,可以通过网络客户端进行验证。 - 但是printk()没有显示出来。 – ajpyles