Phi*_*lip 15 c c++ networking posix network-programming
我充分意识到之间的主要差异poll()
和select()
:
select()
仅支持固定数量的文件描述符select()
据说在更多系统上支持poll()
允许对事件类型进行稍微细粒度的控制poll()
实现在某些细节上可能不同但是,它们都以大致相同的方式完成相同的任务.所以:
我们要用poll()
还是select()
?
编辑:我可能会补充一点,我不感兴趣,epoll()
因为可移植性是我关注的问题.此外,libev(ent)
也不是一个选项,因为我问这个问题,因为我正在编写自己的替换库libev(ent)
.
R..*_*R.. 18
所有的远程现代系统中poll
,这是一个大大优于接口select
/ pselect
在几乎所有方面:
poll
允许更细粒度的状态检测select
.poll
对您可以使用的最大文件描述符没有限制(更重要的是,当您未能检查超过FD_SETSIZE
限制的文件描述符时,没有严重漏洞).我能想到的唯一缺点poll
是:
pselect
,poll
不能原子地取消屏蔽/屏蔽信号,所以你不能用它来等待包含文件描述符活动和信号的一组事件,除非你求助于自管技巧.poll
只有毫秒的等待超时分辨率,而不是微秒(select
)或纳秒(pselect
).当然,便携性poll
不再是一个考虑因素.任何足够缺乏的系统poll
都充满了许多漏洞,它不应该连接到网络.
总之,除非你有非常特殊的需求(微小的超时间隔,令人讨厌的信号交互,扩展到数百万个持久连接等),我只是简单地使用poll
它并完成它.正如其他人所提到的,libevent
也是一个选项,但它不是干净/安全的代码(它的使用select
实际上调用危险的UB试图解决其中的限制select
!)而且我发现使用的代码libevent
通常比简单的代码复杂得多poll
直接使用.
如果您正在为 GNU/Linux 编写代码,则应该查看 epoll(7)。
但对于大多数跨平台支持,您可以考虑使用 libevent。 http://libevent.org/
实际上,在不知道您想要做什么的具体情况的情况下,很难推荐单个轮询/选择实现。
归档时间: |
|
查看次数: |
9437 次 |
最近记录: |