select与poll的异同

select 和 poll 都是 POSIX 标准提供的 I/O 多路复用机制,它们都可以被用于实现非阻塞式 IO。下面列出了 select 和 poll 的基本异同点:

参数形式不同: select 函数使用 fd_set 类型的描述符集合来传递需要监视的文件描述符列表,而 poll 函数使用 struct pollfd 数组类型来指定需要监听的文件描述符及其感兴趣的事件。

描述符数量限制不同: select 函数所支持的最大描述符数量由内核设定,一般情况下默认值为 1024;而 poll 函数能够处理的描述符数量没有固定上限,但也会受到系统资源限制。

提供的事件标志位不同:select 函数仅支持三种事件标志:可读、可写和异常;而 poll 函数支持更多的事件标志:可读、可写、异常、连接断开、优先级带数据和错误事件等。

实现方式不同: select 函数和 poll 函数之间在实现机制上有很大区别,主要表现在对文件描述符集合的维护上。select 函数每次调用时都需要将待检测的文件描述符集合拷贝到内核中去,而 poll 函数则是通过参数传递文件描述符集合,不需要对文件描述符集合进行操作。

兼容性不同: select 函数是传统的多路复用机制,可以在大多数 UNIX 系统上使用;而 poll 函数是 POSIX 标准中才定义的 I/O 多路复用机制,不是所有平台都支持。另外,在一些平台上,select 函数会有一些问题,例如无法正确处理大于 1024 的文件描述符数量等,但是这些问题并不影响 poll 函数的使用。

总的来说,select 和 poll 都可以实现非阻塞式 IO,但是它们各有优缺点,需要根据具体应用场景和系统平台特点选择合适的方法。在 RT-Thread 中,由于其提供的标准 C 库函数较为完备,因此可以使用 select 或 poll 来实现非阻塞 I/O 操作。

【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
select与poll的异同_第1张图片

你可能感兴趣的:(设计模式,网络,tcp/ip,服务器,mcu)