无法在手册中找出 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);
}
}
}
以下是我的假设:
- 以上是服务器代码。
listen_sock
是来自服务器 socket()
的文件描述符 return。
我的问题是:
文件描述符 events[n].data.fd
是什么意思?是服务器的 fd
还是客户端的?
为什么如果 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 添加到 epoll
的 fd
集合中。
最近在研究系统调用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);
}
}
}
以下是我的假设:
- 以上是服务器代码。
listen_sock
是来自服务器socket()
的文件描述符 return。
我的问题是:
文件描述符
events[n].data.fd
是什么意思?是服务器的fd
还是客户端的?为什么如果
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 添加到 epoll
的 fd
集合中。