无法在手册中找出 epoll 示例

Can't figure out epoll example in manual

最近在研究系统调用epoll。我已经对这个主题有了基本的概念,但我坚持使用手册给出的例子。

/* Code to set up listening socket, 'listen_sock',
              (socket(), bind(), listen()) omitted */

epollfd = epoll_create1(0);
if (epollfd == -1) {
   perror("epoll_create1");
   exit(EXIT_FAILURE);
}

ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
   perror("epoll_ctl: listen_sock");
   exit(EXIT_FAILURE);
}

for (;;) {
   nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
   if (nfds == -1) {
       perror("epoll_wait");
       exit(EXIT_FAILURE);
   }

   for (n = 0; n < nfds; ++n) {
       if (events[n].data.fd == listen_sock) {
           conn_sock = accept(listen_sock,
                              (struct sockaddr *) &addr, &addrlen);
           if (conn_sock == -1) {
               perror("accept");
               exit(EXIT_FAILURE);
           }
           setnonblocking(conn_sock);
           ev.events = EPOLLIN | EPOLLET;
           ev.data.fd = conn_sock;
           if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
                       &ev) == -1) {
               perror("epoll_ctl: conn_sock");
               exit(EXIT_FAILURE);
           }
       } else {
           do_use_fd(events[n].data.fd);
       }
   }
}

以下是我的假设:

我的问题是:

  1. 文件描述符 events[n].data.fd 是什么意思?是服务器的 fd 还是客户端的?

  2. 为什么如果 events[n].data.fd == listen_sock ,那么我们需要创建一个新连接?

您可以查看 epoll_wait 的手册页,了解有关 struct epoll_event 及其 data 成员的详细信息,并帮助理解代码。

任何给定的 events[n].data.fd 指的是一个 fd 上面有某种事件。它可以是侦听套接字,也可以是客户端套接字(如果有活动的客户端连接)。

如果 fd 和 activity listen_sock 侦听套接字,这意味着新客户端正在尝试连接。此时我们 accept 连接并将新的 conn_sock fd 添加到 epollfd 集合中。