Appearance
函数原型
功能:阻塞函数,阻塞等待集合中的文件描述符就绪,当有文件描述符准备就绪后,该函数解除阻塞。参考:IO多路复用:poll
c
#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);参数
struct pollfd *fds:指定要监测的集合:
c
struct pollfd *fds {
int fd; /* 指定要监测的文件描述符 */
short events; /* 指定要检测的事件 */
short revents; /* 实际产生的事件 */
}nfds_t nfds:指定要监测的文件描述符个数;
int timeout 设置超时时间,以 ms 为单位:
> 0:设置超时事件,以 ms 为单位= 0:非阻塞,无论是否有文件描述符准备就绪,都会立即解除阻塞< 0:不设置超时事件,会一直阻塞,直到文件描述符准备就绪,解除阻塞
返回值
> 0:成功触发事件的文件描述符个数= 0:超时了- 1:函数运行失败,更新 errno
事件
POLLIN:读事件,对应的空间中有数据可读POLLOUT:写事件,对应的空间中有数据可以输出POLLERR:错误事件
如何检测真实触发的事件?
从上面的 pollfd 结构体可以知道事件本质是短整型的整数,在源代码中事件其实是通过十六进制的数字表示的:linux/poll.h,实际产生的 revents 其实是多个事件按位或之后得到的一个数字,想要判断其中是否包含我们只需要将revents 和 events 按位与即可,例如 fds[1].revents & POLLIN 如果为 0,则表示 fds[1].revents 事件中包含了 POLLIN 事件。