【IO复用之poll】

承接上篇IO复用之select
selet将描述符和事件分离,所以在select接口需要传入三个数组表示不同的事件集合。poll也是在一定时间内轮询所有的描述符,但它将事件和描述结合。

函数签名

#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  1. fd是一个pollfd类型的数组,他指定了描述符上可读、可写等事件
struct pollfd
{
      int fd;            /* 文件描述符 */
      short events;      /* 注册的事件 */
      short revents;     /* 实际发生的事件,由内核填充 */
};

其中events告诉poll监听fd上发生的事件,他的每一位表示一类事件。revents由内核修改,通知应用实际发生了哪些事件。

  1. nfds参数指定监听事件fds大小
typedef unsigned long int nfds_t;

编程示例

int ret = poll(fds, MAX_EVENT_NUM, -1);
for (int i = 0; i < MAX_EVENT_NUM; i++)
{
      if (fds[i].revents & POLLIN) /* 该描述符上有可读事件 */
      {
            int sockfd = fds[i].fd;
            /* do something */
      }
}
posted @ 2020-08-29 00:17  细雨徐行  阅读(99)  评论(0)    收藏  举报