Skip to content
On this page

poll(2)


标签:linux/api  

函数原型

功能:阻塞函数,阻塞等待集合中的文件描述符就绪,当有文件描述符准备就绪后,该函数解除阻塞。参考: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 其实是多个事件按位或之后得到的一个数字,想要判断其中是否包含我们只需要将reventsevents 按位与即可,例如 fds[1].revents & POLLIN 如果为 0,则表示 fds[1].revents 事件中包含了 POLLIN 事件。

Last updated: