I/O复用函数select,poll,epoll到底啥区别?

9次阅读

共计 446 个字符,预计需要花费 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 限制,但是仍然收到进程可打开的最大文件描述符限制。

正文完
 0