文章目录

poll系统调用与select系统调用类似,也是在指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪者。

1
2
3
4
5
6
7
8
/*
引用方式: #include <poll.h>
fds: pollfd结构体数组, 指定程序感兴趣的所有文件描述符上发生的可读/可写/异常事件
nfds: 指定fds有效长度
timeout: 以毫秒为单位的超时值; timeout=-1: poll调用一直阻塞直到某个事件发生 || timeout=0: poll调用立即返回
返回就绪文件描述符总数: 成功 || 返回-1并设置errno: 失败
*/
int poll(struct pollfd * fds, nfds_t nfds, int timeout);

其中,pollfd结构体的定义如下。

1
2
3
4
5
struct pollfd{
int fd;
short int events;
short int revents;
};

其中,fd指定文件描述符,events成员告知poll需要监听fd上哪些事件,它是一系列事件的按位或。

 

revents成员由内核修改,以通知应用程序fd上实际发生了哪些事件。

自Linux2.6.17内核之后,GNU为poll系统调用增加了一个POLLRDHUP事件,它在socket接收到对方关闭连接的请求后触发,从而区分socket上接收到的数据是有效数据还是对方关闭连接的请求。使用POLLRDHUP事件需要在代码最开始处#define _GNU_SOURCE