为什么 Linux 在某些情况下将 accept() 视为 read() 操作?

Why does Linux treat accept() as read() operation in certain cases?

提问人:Sgg8 提问时间:11/5/2023 更新时间:11/5/2023 访问量:56

问:

假设我们有一个 C 语言的套接字服务器,它是使用 poll() 或 epoll() 等轮询方法实现的。并假设使用后者(也是如此)。poll()

在任何现有的此类服务器中,包括手册页中的示例,每当事件发生时,都会在侦听器上调用。它起作用了。这意味着当服务器有待处理的连接要接受时,将触发该事件。但是,该事件的手册页定义是这样说的:epoll()accept()EPOLLINEPOLLINEPOLLIN

EPOLLIN
关联的文件可用于 read(2) 操作。

这意味着这是专门用于操作的事件。EPOLLINread()

为什么它可以用于?我浏览了所有相关的手册页,没有任何地方指定它被视为内部轮询机制。然而,它确实是这样工作的。accept()accept()read()

C Linux 套接字 网络 epoll

评论

0赞 Barmar 11/5/2023
没有特定的事件,因此被任意用于此目的。accept()EPOLLIN
2赞 Barmar 11/5/2023
它对应于在可接受时添加 FD 的方式。select()readfds
0赞 Sgg8 11/5/2023
@Barmar我明白,但为什么手册上没有说明它。事实上,手册只在事件描述中提及是错误的read()
0赞 Remy Lebeau 11/6/2023
EPOLLIN仅表示套接字处于可读状态。当侦听套接字具有要接受的挂起连接时,它处于可读状态。

答:

3赞 Barmar 11/5/2023 #1

accept(2) 的文档对此进行了解释:

为了在套接字上收到传入连接的通知,您需要 可以使用 、 或 。可读事件将 在尝试新连接时交付,然后您可以 调用以获取该连接的套接字。 或者,您可以将套接字设置为在以下情况下交付 活动发生在插座上;有关详细信息,请参阅。select(2)poll(2)epoll(7)accept()SIGIOsocket(7)