2

select函数只能轮询linux操作系统提供的fd_set这个类型的变量,这个类型是个数组,且长度是FD_SETSIZE,这个值是1024,是个定值。因此select只能监听1024个文件描述符是对的,但是并不是只能打开1024个文件(socket也是文件),进程能打开的文件是受另一个变量控制,这个变量是进程能打开的最大文件描述符(用ulimit -n可以查看),而这个变量和FD_SETSIZE不是一个东西,只是这个东西的默认值恰好也是1024。

poll函数轮询的是pollfd这个类型的数组,这个数组可以自己定义长度,而不是上面select函数只能轮询定长为FD_SETSIZE的fd_set变量。它轮询的仍是数组,而不是链表,虽然能监听的文件数不受FD_SETSIZE限制,但是仍然收到进程可打开的最大文件描述符限制。

epoll不再是轮询,而是给每个文件描述符上发生的io事件设置一个回调函数。它能监听的文件数不受FD_SETSIZE限制,但是仍然收到进程可打开的最大文件描述符限制。


Linus脱袜子
183 声望63 粉丝

硕士研究生在读。