c - 带轮询的非阻塞套接字

标签 c sockets posix blocking

几天前,我不得不调查一个问题,我的应用程序在(显然)处于空闲状态时显示异常高的 CPU 使用率。我将问题追溯到一个循环,该循环旨在阻止 recvfrom 调用,而套接字已设置为 O_NONBLOCK-ing 导致自旋锁。有两种解决问题的方法:将套接字设置为阻塞或使用 pollselect 轮询套接字上的可用数据。我选择了前者,因为它更简单。但我想知道为什么有人会创建一个非阻塞套接字然后单独对其进行轮询。阻塞套接字不做同样的事情吗?使用非阻塞套接字和轮询组合的用例是什么?在一般情况下它有什么优势吗?

最佳答案

poll()select() 与非阻塞文件描述符一起使用有两个优点:

  • 您可以设置阻止的超时时间;
  • 您可以等待一组 文件描述符中的任何一个变得可用。

如果您只有一个文件描述符(套接字)需要等待,并且您不介意无限期地等待它,那么可以;你可以只使用阻塞调用。

第二个优势确实是 select() 和 friend 的 killer 级用例。这意味着您可以处理多个套接字连接,以及标准输入和标准输出以及可能的文件 I/O,所有这些都通过一个控制线程完成。

关于c - 带轮询的非阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3360797/

相关文章:

c - --*--指针操作?

Python:Socket.timeout 不由 except 处理

Posix 共享内存与映射文件

c - aio_write() 的简单示例

c - C中的类型转换

c++ - 带有CMake的Swig无法找到 header 包括

c - Memset 覆盖另一个数组

Cocoa AsyncUDPSocket 框架,(长)标签变量解释和我的委托(delegate)有时会被调用

sockets - 我应该在bind()或listen()错误上调用close()吗

c - 列出所有线程