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限制,但是仍然收到进程可打开的最大文件描述符限制。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。