当前位置: 首页 > Linux

I-O多路复用函数select、poll、epoll有什么区别?

时间:2023-04-07 01:37:27 Linux

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的限制,但仍然受限于进程可以打开的最大文件描述符。