2012-05-21 45 views
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"); 
+0

如果其他'printk's正在这时,我怀疑是控制从来没有到达最后'printk'。在这里有很多方法,控制可能不会来到你想要的'printk' - 一个无限的'while'循环,通过'schedule','goto'语句放弃控制。 –

+0

此代码位于无限循环内。一切似乎都很好,这很奇怪。这是一台网络服务器,一切似乎都正常,可以通过网络客户端进行验证。 - 但是printk()没有显示出来。 – ajpyles

回答

2

优先添加日志消息:

像:中printk(KERN_ALERT您的信息); KERN_ALERT和您的消息 之间不会有“逗号”,如果不是KERN_ALERT,则尝试使用不同的LEVELS级别。

RGDS, 多愁善感

+1

感谢您的建议。事实证明,其他事情正在发生。我决定尝试另一种方法,我不使用等待队列。我甚至尝试过KERN_EMERGENCY,但没有任何显示。 – ajpyles