如何在内核中将套接字配置为非阻塞或在accept()调用上超时?

时间:2012-07-11 13:37:09

标签: sockets linux-kernel blocking nonblocking

在Linux内核模块中,我希望调用侦听套接字的accept处理程序,而不是在内核线程中等待。所以我需要将O_NONBLOCK传递给accept处理程序。但我想在连接的套接字上使用超时,而不是非阻塞套接字。

我知道有两种机制可以将内核中的套接字配置为非阻塞。将O_NONBLOCK传递给sock->opstruct socket * sock)中的接受或连接处理程序。我不知道如何重置O_NONBLOCK标志。如何更改套接字上的O_NONBLOCK标志?

是否有替代方法,例如接受超时?这将允许侦听端口上的连接套接字阻塞。

1 个答案:

答案 0 :(得分:0)

不幸的是,术语“套接字”用于指代几个不同的东西。用户空间中的那个(通过带有小整数值的打开文件描述引用)具有可以使用fcntl设置的状态。内核空间中的一个(指向实际连接端点的指针)没有。将O_NONBLOCK传递给接受或连接处理程序只会使特定的接受或连接操作成为非阻塞。