gpt4 book ai didi

c - 仅使用 1 个非阻塞套接字时执行 select() 是否有意义?

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:11 24 4
gpt4 key购买 nike

我的应用程序只有 1 个用于 recv() 和 send() 的 Unix TCP 套接字。套接字是非阻塞的。鉴于此,在 send()/recv() 之前执行 select() 是否有优势?

如果底层 TCP 管道没有为 I/O 做好准备,send()/recv() 应该立即返回一个 EWOULDBLOCK 或 EAGAIN。那么,执行 select() 有什么意义呢?看起来,在这种情况下,它可能只会导致额外的系统调用开销。我错过了什么吗?

编辑:忘记提及:该应用程序是单线程的。

最佳答案

如果您的套接字非阻塞,那么您需要select (或者最好是 poll ,它没有破坏 FD_SETSIZE 限制和相关的危险)为你阻塞而不是在 send 中发生的阻塞(如果套接字不是非阻塞)。和 recv .否则你会旋转,使用 100% 的 cpu 时间什么都不做。在大多数情况下,您可以轻松地使套接字阻塞并取消 select/poll .然而,有一个有趣的案例需要考虑:如果您的程序在 send 中被阻塞,则阻塞 IO可能死锁。而套接字另一端的程序也在send中被阻塞(或相反)。使用非阻塞 IO 和 select/poll ,您自然会检测到这种情况并在无法写入输出时处理待处理的输入。

关于c - 仅使用 1 个非阻塞套接字时执行 select() 是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16719684/

24 4 0
文章推荐: c - 如何使用 autotools 构建架构/机器相关代码
文章推荐: javascript - ReactJS:如何删除 Material-UI 的 的 上的行突出显示?
文章推荐: 在c中复制链表