如何使用 POSIX select()
在 select()
中使用文件描述符之前,我是否应该将其设置为非阻塞?
Shoud I make file descriptors non-blocking before using them in select()
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在 select()
中使用文件描述符之前,我是否应该将其设置为非阻塞?
Shoud I make file descriptors non-blocking before using them in select()
?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
没关系。
select
告诉您哪些套接字可读/可写/已关闭/具有您感兴趣的状态。阻塞/非阻塞会影响recv
或send 等方式
调用行为。这些是相互独立的。Doesn't matter.
select
tells you which sockets are readable/writable/closed/have state that you're interested in. Blocking/non-blocking affects how e.g. arecv
orsend
call acts. These are independent of each other.无论它用来监视的描述符的阻塞状态如何,Select 本身都会阻塞。如果您不想 select 阻塞,请使用超时 0(即指向为零的 timeval 结构,而不是 nil 指针)。
Select itself will block regardless of the blocking status of the descriptors it is used to monitor. If you don't want select to block, use a timeout of 0 (i.e. point to a timeval structure of zero, not a nil pointer).
select
的目标是阻塞,因此它会忽略非阻塞标志。但是,正如 Linux 手册页中的 bug 部分:因此,由于错误行为,您应该将文件描述符设置为非阻塞。
The goal of
select
is to block, so it will ignore the non blocking flag. However, as described in the bugs section in the Linux manual pages:So, due to buggy behavior, you should set the file descriptors to non-blocking.