我研究了 poll
、epoll
和 select
之间的区别。但我不明白的是,在什么情况下应该使用 select
。鉴于 poll
和 epoll
具有 select
所具备的所有功能,而且还有更多的功能,因此我并没有看到任何优势。
我研究了 poll
、epoll
和 select
之间的区别。但我不明白的是,在什么情况下应该使用 select
。鉴于 poll
和 epoll
具有 select
所具备的所有功能,而且还有更多的功能,因此我并没有看到任何优势。
从历史上看,select
在1983年的BSD4.2中首先出现。作为第一个出现的系统调用,它具有最广泛和最可移植的特权。
尽管如此,select
和 poll
都无法良好扩展。根据 LIBEV(3)
的说法,select
扩展到 O(highest_fd)
,而 poll
则扩展到 O(total_fds)
。对于大量文件描述符,epoll
的扩展性要好得多,但它只适用于 Linux。
使用像 libevent
、libev
或 libuv
这样的事件库会提供一个抽象层,并尝试在您的系统上使用最高效的方法,因此您不必担心选择 select
、poll
、epoll
或 kqueue
(适用于 MacOS 和 BSD)之间的区别。
select()
”呢? - user207421man select(2)
读取的内容是:select() 符合...4.4BSD(select() 最初出现在 4.2BSD)。 - Samuel Hunterselect() 监视的文件描述符比 poll() 少。此外,一些 select() 的实现只是使用了 poll()。
epoll()
是Linux特有的,如果您需要可移植性,只能使用select()
和poll()
。 - Ingo Leonhardtselect
比epoll
更快。此外,epoll
是Unix专用的。select
有一个最大限制(我认为是1024),而epoll
没有。 - ja_mesaselect
是最可移植的,poll
次之,而epoll
仅适用于Linux。使用select
和poll
比epoll
更简单,但如果需要可扩展性,则应尽可能使用epoll
。 - Shafik Yaghmourselect()
比poll()
先出现了很多年。 - user207421