一. 简介
本文来学习 Linux下处理非阻塞IO访问的两种函数: select函数与 poll函数。
主要来说明一下,select函数与 poll函数的主要区别。
二. Linux下处理非阻塞IO方法:select函数与 poll函数的区别
select 和 poll 都是 POSIX 标准提供的 I/O 多路复用机制,它们(是应用层的函数)都可以被用于实现非阻塞式 IO访问。
select函数与 poll函数的区别:
1. 参数形式不同:
select 函数使用 fd_set 类型的描述符集合来传递需要监视的文件描述符列表,而 poll 函数使用 struct pollfd 数组类型来指定需要监听的文件描述符及其感兴趣的事件。
2. 描述符数量限制不同:
select 函数所支持的最大描述符数量由内核设定,一般情况下默认值为 1024;而 poll 函数能够处理的描述符数量没有固定上限,但也会受到系统资源限制。
3. 提供的事件标志位不同:
select 函数仅支持三种事件标志:可读、可写和异常;而 poll 函数支持更多的事件标志:可读、可写、异常、连接断开、优先级带数据和错误事件等。
4. 实现方式不同:
select 函数和 poll 函数之间在实现机制上有很大区别,主要表现在对文件描述符集合的维护上。select 函数每次调用时都需要将待检测的文件描述符集合拷贝到内核中去,而 poll 函数则是通过参数传递文件描述符集合,不需要对文件描述符集合进行操作。
5. 兼容性不同:
select 函数是传统的多路复用机制,可以在大多数 UNIX 系统上使用;而 poll 函数是 POSIX 标准中才定义的 I/O 多路复用机制,不是所有平台都支持。另外,在一些平台上,select 函数会有一些问题,例如无法正确处理大于 1024 的文件描述符数量等,但是这些问题并不影响 poll 函数的使用。
总结
select函数与 poll函数最主要的区别是:
描述符数量限制不同: select 函数所支持的最大描述符数量由内核设定,一般情况下默认值为 1024;而 poll 函数能够处理的描述符数量没有固定上限,但也会受到系统资源限制。
参考文章: