-
Notifications
You must be signed in to change notification settings - Fork 54
poll
果冻虾仁 edited this page Aug 22, 2017
·
18 revisions
poll()和select()原理相同,但实现方式不同。select()用的更为频繁,但据说poll()效率更高,不过自Linux 2.5.44后被epoll取代。
#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);pollfd结构的数组。
检测每个结构中的fd对应的events事件是否就绪。在poll返回的时候将就绪情况写入到revents中。
nfds_t是unsigned long类型,据《UNP》所言,该类型过大了。
- -1:永远等待(一说:负数)
- 0:不等待,立即返回
-
0:等待指定数目的毫秒数
- 0: 表示超时返回
- -1:表示出错
-
0:表示就绪的的文件描述符的数量
poll()与select()返回正数时,其含义有差别:
- select(): 如果同一个文件描述符在多个fd集(select有三个fd集合)中返回,则返回值也统计多次
- poll():即使同一个fd出现在多个pollfd元素的
revents成员中,也只被统计一次。
非typedef的结构体类型
| 成员 | 类型 | 说明 |
|---|---|---|
| fd | int | |
| events | short | |
| revents | short | |
events和revents都是bit masks。events是输入,revents是输出(返回),events由用户设置,revents在函数返回时被设置。其取值可以是如下宏的按位或的结果: |
| 输入事件bit位 | events的输入? | revents的结果? | 说明 |
|---|---|---|---|
| POLLIN | √ | √ | 有数据可读 |
| POLLRDNORM | √ | √ | 等价于POLLIN |
| POLLPRI | √ | √ | 高优先级数据可读 |
| POLLRDHUP | √ | √ | 对等套接字关闭 |
| 输出事件bit位 | events的输入? | revents的结果? | 说明 |
| POLLOUT | √ | √ | 普通数据可写 |
| POLLWRNORM | √ | √ | 等价于POLLOUT |
| POLLWRBAND | √ | √ | 优先级数据可写 |
| 错误事件bit位 | events的输入? | revents的结果? | 说明 |
| POLLERR | √ | 发生错误 | |
| POLLHUP | √ | 发生挂起 | |
| POLLNVAL | √ | (invalid)fd没有被打开 |
POLLRDHUP 从
Linux 2.6.17开始被支持
差异性:《UNP》中提到的POLLRDBAND其实并不被Linux支持;此外《UNP》中POLLIN与POLLRDNORM,POLLOUT与POLLWRNORM也并非等价。
Talk is cheap, show me the code!
C语言API包含部分标准C的API、POSIX标准的系统编程API(一些Linux独有的系统API会单独注明)。
大部分头文件源码在/usr/include目录下。
因为涉及到大量的POSIX编程。所以最好下载POSIX函数的man手册。
apt-get install manpages-posix
apt-get install manpages-posix-dev
默认安装了manpages-dev,所以不装POSIX的man手册是可以查看绝大部分API的。
但是不装的话,有些API是不能看到的,比如posix_spawn函数。
yum install man-pages.noarch
关于目录
左侧的目录并非以函数为索引依据,主要是以系统的man手册页面为索引依据。
比如exec里面包含6个函数、pipe里面包含pipe()和pipe2()两个函数,但是它们都是属于一个man页面中。