【问题标题】:linux kernel waitqueues - printk not showing in message loglinux内核等待队列 - printk未显示在消息日志中
【发布时间】:2012-05-22 01:38:37
【问题描述】:

我注意到内核模块中有一些奇怪的行为。当我运行以下代码(使用等待队列)时。在finish_wait() 之后,printk() 不会出现在内核日志中。 第 5 行也只打印一次。有什么想法吗?

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");

【问题讨论】:

  • 如果其他printks 正在工作,我怀疑控件从未到达最后一个printk。这里有很多方法可能无法控制您想要的printk - 一个无限的while 循环,通过schedulegoto 语句放弃控制。
  • 这段代码在一个无限的while循环中。一切似乎都运行良好,这很奇怪。这是一个网络服务器,一切似乎都正常工作,我可以使用网络客户端进行验证。 -- 但是 printk() 没有出现。

标签: linux-kernel


【解决方案1】:

将优先级添加到日志消息中:

点赞:printk(KERN_ALERT 你的消息); KERN_ALERT 和您的消息之间也不会有“逗号” 如果不是 KERN_ALERT,请尝试使用不同的 LEVELS。

Rgds, 软软的

【讨论】:

  • 感谢您的建议。事实证明,还有其他事情正在发生。我决定尝试另一种不使用等待队列的方法。我什至尝试了 KERN_EMERGENCY 并没有出现任何内容..
猜你喜欢
  • 2018-06-05
  • 1970-01-01
  • 2016-12-13
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多