Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我使用了一些遗留代码:非阻塞套接字,选择超时,读取(2)和写入(2)。现在它偶尔会由于 select/1024 fd 限制而失败。所以我需要更换选择。
似乎 RCVTIMEO 和 SNDTIMEO 也可以检查超时,但它们适用于阻塞模式,并且从非阻塞更改为阻塞影响太大。
那么还有其他最佳实践来检查非阻塞套接字(无选择)的超时吗?或者我必须得到一些计时器/纳米睡眠来解决这个问题?
poll()本质上是 using 的直接替代品select(),但没有 1024 个文件描述符限制。您必须稍微更改代码以创建struct pollfd结构数组而不是使用fd_sets,但代码的整体结构不必更改。
poll()
select()
struct pollfd
fd_set
epoll 是比 select 更好的解决方案,不限于 1024 个描述符。
事实上,你可以使用libevent或libev来处理低级异步套接字 I/O,它们是所谓的异步 I/O 的“最佳实践”。
poll() 系统调用将超时,并且没有固定的文件描述符限制。如果你真的有 1000 个开放描述符,你可能会更好地使用 epoll(),它使用起来更复杂,但具有更好的缩放特性。