如何优雅地退出阻塞kernel_recvmsg()?

时间:2017-03-26 19:13:46

标签: multithreading sockets linux-kernel

我在内核线程中运行以下内容:

size = kernel_recvmsg(kthread->sock, &msg, &iov, 1, bufsize, MSG_DONTWAIT)

我非常频繁地接收UDP数据包(每10分钟就可以说)。为了尽可能快地处理它们,我在kernel_recvmsg()所在的循环中没有任何睡眠。不幸的是,当UDP数据包没有到来时,我观察到非常大的CPU消耗。 如果我使套接字阻塞(删除MSG_DONTWAIT)是否有一些间接的方式来解除阻塞并退出kernel_recvmsg()..?

如果我做了意外的sock_release()会怎么样? kernel_recvmsg()是否应该解锁并返回一些错误,我可以相应地处理它(退出循环和线程)?

1 个答案:

答案 0 :(得分:0)

很容易从另一个线程解除阻塞UDP等待 - 发送到()它是一个数据报在本地堆栈上取消阻塞它(一个空的就可以了)。你可以使用一些' abort' bolean标志指示post-kernel_recvmsg代码返回或执行一些其他异常操作。

也就是说,如果套接字从另一个线程关闭,成熟操作系统上的通信堆栈很少没有解锁套接字等待。我已经听说过这是不可靠的,但我从来没有见过任何情况,如果底层套接字被释放,就不会立即引发错误返回或异常。

相关问题