linux poll和select的区别
时间: 2023-10-09 12:05:51 浏览: 54
Linux中,poll和select都是用于I/O多路复用的函数,但是它们之间有一些区别。
1. 参数不同: select的参数是一个 fd_set 结构体; poll 的参数是一个 pollfd 的结构体数组。
2. 触发方式不同:select会通过循环遍历的方式扫描所有的 fd,如果没有I/O事件的话会阻塞等待;poll则是将所有的 fd 都加入到一个监听队列中,遍历监听队列查看是否有I/O事件的到来。
3. 扩展性方面不同:因为 select 是一个固定长度的数组,使用时需要设置数组的大小,如果超出了该大小则需要使用其他的方法扩展;poll允许动态的增删 fd,可以根据需要动态的调整大小。
4. 精度问题不同: 可以通过调整 timeout 参数来调整 select 的精度。poll则相对更加精准一些,因为它可以取到更加详细的 I/O 事件信息。
总之, poll 在绝大多数情况下都比 select 更加好用,但是在某些特殊的情况下(例如 Windows 平台下)只支持 select。
相关问题
linux poll和select区别 也是通过sigalrm
Linux中的poll和select函数都用于多路复用IO操作,但它们之间有一些区别。
select函数是较早引入的,而poll函数是后来的替代者。它们的最大区别在于数据结构和可处理的文件描述符的数量。
在使用select函数时,需要创建一个fd_set结构体,将要监视的文件描述符添加到fd_set中,然后调用select函数来阻塞等待文件描述符就绪。但是select函数的一个限制是,它使用的fd_set结构体是一个固定大小的位图,在实际应用中最大只能处理1024个文件描述符。这个限制是因为fd_set结构体的位图的大小是通过宏定义来确定的,无法在运行时动态调整。
而poll函数则没有这样的限制。它使用一个pollfd结构体数组来存储要监视的文件描述符以及每个文件描述符的监视事件,然后调用poll函数来阻塞等待文件描述符就绪。poll函数没有数量限制,可以处理任意数量的文件描述符。
另外一个区别是在处理超时的方式上。select函数使用了sigalrm信号来处理超时,需要先设置一个定时器,然后等待信号触发。而poll函数并不依赖于信号处理,它使用一个超时参数来指定等待时间。
综上所述,poll函数相较于select函数更加灵活,可处理的文件描述符数量更大,并且不依赖于信号处理来处理超时。在使用时需要根据实际需求选择适合的函数。
linux select poll epoll
select, poll, 和 epoll 是 Linux 中用于多路复用 I/O 操作的机制。
select 是最古老且最简单的一种机制。它采用轮询的方式来监视一组文件描述符的状态,当其中任何一个文件描述符就绪时,select 函数将返回,并且可以通过操作系统提供的接口来查看哪些文件描述符已经就绪。select 的缺点是,在较大规模的文件描述符集合中性能较差。
poll 是对 select 的改进,使用方式类似。poll 使用链表来保存文件描述符集合,因此没有了描述符数量限制,但是性能仍然受到最大文件描述符数量的限制。
epoll 是 Linux 特有的一种机制,它使用事件驱动的方式来监视文件描述符。epoll 使用一个事件表来存储感兴趣的文件描述符和相应的事件,可以高效地支持大规模并发连接。epoll 提供了三个接口函数:epoll_create、epoll_ctl 和 epoll_wait,分别用于创建 epoll 实例、向 epoll 实例添加或删除文件描述符以及等待文件描述符就绪。
总结来说,select 和 poll 对于较小规模的并发连接可以胜任,而在大规模并发连接的场景下,epoll 是更好的选择。