【发布时间】: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循环,通过schedule、goto语句放弃控制。 -
这段代码在一个无限的while循环中。一切似乎都运行良好,这很奇怪。这是一个网络服务器,一切似乎都正常工作,我可以使用网络客户端进行验证。 -- 但是 printk() 没有出现。
标签: linux-kernel