c++ - 我们应该使用 poll() 还是 select()?

标签 c++ c networking network-programming posix

我完全了解 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/

相关文章:

c++ - 如何使cmake输出到 "build"目录?

c++ - 没有来自 'const std::__1::basic_string<char> to ' std::__1::basic_string<char> *' 的可行转换

c - 在 C 接口(interface)中从 Prolog 获取列表元素

c - 解决密码学问题,代码需要很长时间才能运行,需要对其进行优化

c - 循环内的 strcat() 与 sprintf()

macos - Mac OS X 中的虚拟网络接口(interface)

c++ - std::vector.at()。它返回引用或拷贝吗?

c++ - 如何实现类模板的前向声明

c# - 监视 Windows 应用程序的(网络)资源利用率和性能

ruby-on-rails - 无法访问 http ://localhost:3000