深入探究:linux中的select与poll功能差别分析 (linux select与poll)

深入探究:Linux中的Select与Poll功能差别分析

在Linux编程中,select和poll是两个常用的IO多路转接函数。它们可以在同一个进程等待多个文件描述符的可读或可写事件,以提高I/O性能。虽然它们的功能相似,但这两个函数仍有不同点。在本文中,我们将深入探究Select与Poll的功能差异,希望能够帮助读者更好地使用这两个函数。

Select和Poll的相似点

在开始比较之前,我们先来看看Select和Poll的相似之处。它们都可以等待多个文件描述符的可读或可写事件,并在有事件发生时返回。它们返回的方式也都是通过传入的参数来修改原有的描述符集。

具体来说,它们都需要传入三个参数:

1. nfds: 需要等待事件的文件描述符的总数(即监听的文件描述符的更大值+1)

2. readfds: 可读事件的描述符,包含需要等待可读事件的文件描述符

3. writefds: 可写事件的描述符,包含需要等待可写事件的文件描述符

除此之外,它们还有一个共同点,即它们的函数原型是一样的:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

两个函数的参数类型和返回值也基本相同,这一点比较容易理解。

Select和Poll的不同点

虽然Select和Poll的原型和参数基本相同,但它们的实现方式有所不同,这导致它们的性质也不同,下面我们从多个方面对这两个函数进行比较。

1. 参数传递方式

在参数传递方式方面,Select使用fd_set类型的参数,而Poll使用pollfd结构体数组。相对来说,Poll的参数传递更加灵活,因为它可以在pollfd结构体中添加更多的字段,例如事件类型等。

2. 文件描述符数量限制

在文件描述符数量方面,Select的限制较小。在大多数系统中,它可以等待1024个事件,但是在一些系统中,它只能等待最多256个事件。相比之下,Poll没有这个限制,可以等待任意个文件描述符。

3. 兼容性

在兼容性方面,Select更加广泛。Select的API在早期的UNIX系统上得到了广泛的应用,并已经成为了POSIX标准的一部分。而Poll是在较晚的时候才被引入的,尽管它也成为了POSIX标准的一部分,但是许多早起的UNIX系统不支持它。

4. 可维护性

在可维护性方面,Poll更加方便。在使用select函数时,修改代码需要同时修改fd_set变量中的值,这会影响到整个程序的运行。而Poll可以通过改变pollfd结构体中的字段来达到同样的效果,不会影响程序的其它部分。

5. 事件类型

在事件类型方面,Select只支持两种类型的事件:可读和可写。而Poll支持更多的事件类型,例如消息队列可以使用POLLPRI类型的事件。

6. 更加高效

在效率方面,Poll更加高效。因为在使用Select函数时,每次调用都需要把所有待监听的文件描述符的fd_set变量拷贝一遍,这会增加额外的开销。而在Poll中,只需要把pollfd结构体数组拷贝一遍即可。

结论

通过以上讨论,我们可以得出以下结论:

1. 在可维护性上,Poll更加方便,因为它只需要通过修改pollfd结构体中的字段就能实现。

2. 在支持的事件类型上,Poll更加丰富。

3. 在可等待的文件描述符数量上,Poll没有限制。

4. 在效率上,Poll更加高效。

5. 在兼容性上,Select更加广泛。

在实际应用中,我们需要根据业务需要来选择哪个函数。如果需要支持更多的事件类型或者文件描述符数量超过了1024个,或者之前的代码就是使用Poll函数,那么就需要选择Poll函数。而如果需要在所有的UNIX系统上使用,或者只需要监听可读可写事件,那么Select函数就够用了。当然,如果你不确定使用哪个函数,也可以进行测试,以获得更好的效果。

相关问题拓展阅读:

linux下串口收发的问题,下面一段代码,select返回的始终是0,程序处于阻塞状态,无法读到数据,在线等

1. 确认是否成功打开的串口设备?

2. 确认打开串口后, 是否设置了波特率等一系列的参数?

3. 确认是否可成功写入?

4. 尝试使用poll 来代替select. 对于系统设备, 有时select不能正常工作而poll是可以的。

关于linux select与poll的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 深入探究:linux中的select与poll功能差别分析 (linux select与poll)