select与poll的异同

select和poll是两种POSIX标准的I/O多路复用方法,用于非阻塞IO。select使用fd_set描述符集合,最大描述符数通常为1024,而poll使用structpollfd数组,无固定上限,支持更多事件标志。select在每次调用时需拷贝集合到内核,而poll直接传递。poll具有更好的兼容性和扩展性,但在某些旧系统或资源有限环境下,select可能是更可行的选择。RT-Thread操作系统支持这两种机制来实现非阻塞I/O操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最后一个bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值