我完全了解 poll()
之间的主要区别。和 select()
:
-
select()
只支持固定数量的文件描述符 -
select()
据说在更多系统上得到支持 -
poll()
允许对事件类型进行更细粒度的控制 -
poll()
实现可能在某些细节上有所不同
但是,它们都以大致相同的方式完成相同的任务。所以:
我们可以使用 poll()
或 select()
?
编辑:我可以补充一点,我对 epoll()
不感兴趣因为便携性是我关心的问题。此外,libev(ent)
也不是一个选项,因为我问这个问题是因为我正在为 libev(ent)
编写自己的替换库.
最佳答案
所有远程现代系统都有 poll
,它在几乎所有方面都比 select
/pselect
更优越:
poll
允许比select
更细粒度的状态检测。poll
对您可以使用的最大文件描述符没有限制(更重要的是,当您未能检查超过FD_SETSIZE
的文件描述符时,没有严重漏洞> 限制)。
我能想到的使用 poll
的唯一缺点是:
- 与
pselect
不同,poll
不能自动取消屏蔽/屏蔽信号,因此您不能使用它来等待包含文件描述符事件和信号的一组事件除非你使用自管技巧。 poll
对于等待超时只有毫秒分辨率,而不是微秒 (select
) 或纳秒 (pselect
)。
poll
的可移植性当然不再是考虑因素。任何老到缺少 poll
的系统都充满了很多漏洞,因此不应该连接到网络。
总之,除非您有非常特殊的需求(微小的超时间隔、讨厌的信号交互、扩展到数百万个持久连接等),否则我会简单地使用 poll
并完成它。正如其他人所提到的, libevent
也是一种选择,但它不是干净/安全的代码(它对 select
的使用实际上会调用危险的 UB,试图解决 的限制select
!),我发现使用 libevent
的代码通常比直接使用 poll
的代码复杂得多。
关于c++ - 我们应该使用 poll() 还是 select()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8438407/