系统调用poll()执行的任务同select()很相似。两者间主要的区别在于我们要如何指定待检查文件描述符。在select()中,我们提供三个集合,在每个集合中标明我们感兴趣的文件描述符。而在poll()中我们提供一列文件描述符,并在每个文件描述符上标明我们感兴趣的事件。参数fds列出了我们需要poll()来检查的文件描述符。该参数为pollfd结构体数组,其定义如下。

poll参数
参数nfds制定了数组fds中元素的个数。数据类型nfds_t实际为无符号整型。
pollfd结构体中的events和revents字段都是位掩码。调用者初始化events来指定需要为描述符fd
做检查的事件。当poll()返回时,revents被设定以此来表示该文件描述符上事件发生的事件。
下表列出了可能会出现在events和revents字段中的位掩码。

poll的Linux实现:
尽管被定义为不同的位掩码,POLLIN和POLLRDNORM 是同义词。
尽管被定义为不同的位掩码,POLLOUT和POLLWRNORM是同义词。
一般来说POLLRDBAND是不被使用的,也就是说它在events 字段中被忽略,也不会设定到revents 中去。
尽管在特定情形下可用于对套接字的设定,POLLWRBAND并不会传达任何有用的信息。(不会出现当 POLLOUT 和POLLWRNORM 没有设定,而设定了POLLWRBAND的情况。)
必须定义_XOPEN_ _SOURCE 测试宏,这样才能在头文件<po11.h>中得到常量POLLRDNORM、POLLRDBAND、 POLLWRNORM 以及POLLWRBAND的定义。
POLLRDHUP 是Linux 专有的标志位,从2.6.17 版内核以来就一直存在。要在头文件<po11. h>中得到它的定义,必须定义_ GNU_ _SOURCE测试宏。
如果指定的文件描述符在调用po11()时关闭了,则返回POLLNVAL。
总结以上要点,po110真

文章详细介绍了poll()系统调用的工作原理,包括参数fds、nfds、events和revents的含义,以及与select()的不同,如无文件描述符数量限制、独立的事件检查等。还提供了poll()在处理文件描述符关闭、超时和返回值方面的信息,并给出了一段使用poll实现多客户端连接服务器的C语言代码示例。
最低0.47元/天 解锁文章
1484

被折叠的 条评论
为什么被折叠?



