如何使用 POSIX select()

发布于 2024-10-30 16:56:38 字数 56 浏览 1 评论 0原文

select() 中使用文件描述符之前,我是否应该将其设置为非阻塞?

Shoud I make file descriptors non-blocking before using them in select()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

丢了幸福的猪 2024-11-06 16:56:38

没关系。

select 告诉您哪些套接字可读/可写/已关闭/具有您感兴趣的状态。阻塞/非阻塞会影响 recvsend 等方式 调用行为。这些是相互独立的。

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. a recv or send call acts. These are independent of each other.

栖迟 2024-11-06 16:56:38

无论它用来监视的描述符的阻塞状态如何,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).

枉心 2024-11-06 16:56:38

select 的目标是阻塞,因此它会忽略非阻塞标志。但是,正如 Linux 手册页中的 bug 部分:

在 Linux 下,select() 可能会将套接字文件描述符报告为“已准备好读取”,但后续读取会阻塞。例如,当数据已到达但经检查校验和错误并被丢弃时,可能会发生这种情况。可能还有其他
文件描述符被虚假报告为的情况
准备好。因此,在应该使用 O_NONBLOCK 的套接字上使用 O_NONBLOCK 可能更安全。
不阻止。

因此,由于错误行为,您应该将文件描述符设置为非阻塞。

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:

Under Linux, select() may report a socket file descriptor as "ready for reading", while nevertheless a subsequent read blocks. This could for example happen when data has arrived but upon examination has wrong checksum and is discarded. There may be other
circumstances in which a file descriptor is spuriously reported as
ready. Thus it may be safer to use O_NONBLOCK on sockets that should
not block.

So, due to buggy behavior, you should set the file descriptors to non-blocking.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文