poll()
或 epoll()
等轮询方法实现的。假设使用后者(同样适用于poll()
)。
在任何现有的此类服务器中,包括
epoll()
手册页中的示例,每当 accept()
事件发生时,就会在侦听器上调用 EPOLLIN
。它有效。这意味着当服务器有待接受的连接时,会触发 EPOLLIN
事件。然而,EPOLLIN
事件的手册页定义说:
艾波林
关联的文件可用于 read(2) 操作。
这意味着
EPOLLIN
是专门针对 read()
操作的事件。
为什么可以用于
accept()
?我浏览了所有相关的手册页,但没有指定 accept()
在轮询机制中被视为 read()
。然而它确实是这样工作的。
accept(2)
的文档中进行了解释:
为了收到套接字上传入连接的通知,您 可以使用
、select(2)
或poll(2)
。可读的事件将 当尝试新连接时传递,然后您可以 调用epoll(7)
获取该连接的套接字。 或者,您可以将套接字设置为在以下情况下传递accept()
: 活动发生在套接字上;详情请参阅SIGIO
。socket(7)