提问人:Sgg8 提问时间:11/5/2023 更新时间:11/5/2023 访问量:56
为什么 Linux 在某些情况下将 accept() 视为 read() 操作?
Why does Linux treat accept() as read() operation in certain cases?
问:
假设我们有一个 C 语言的套接字服务器,它是使用 poll() 或 epoll()
等轮询方法实现的。并假设使用后者(也是如此)。
poll()
在任何现有的此类服务器中,包括手册页中的示例,每当事件发生时,都会在侦听器上调用。它起作用了。这意味着当服务器有待处理的连接要接受时,将触发该事件。但是,该事件的手册页定义是这样说的:epoll()
accept()
EPOLLIN
EPOLLIN
EPOLLIN
EPOLLIN
关联的文件可用于 read(2) 操作。
这意味着这是专门用于操作的事件。EPOLLIN
read()
为什么它可以用于?我浏览了所有相关的手册页,没有任何地方指定它被视为内部轮询机制。然而,它确实是这样工作的。accept()
accept()
read()
答:
3赞
Barmar
11/5/2023
#1
accept(2)
的文档对此进行了解释:
为了在套接字上收到传入连接的通知,您需要 可以使用 、 或 。可读事件将 在尝试新连接时交付,然后您可以 调用以获取该连接的套接字。 或者,您可以将套接字设置为在以下情况下交付 活动发生在插座上;有关详细信息,请参阅。
select(2)
poll(2)
epoll(7)
accept()
SIGIO
socket(7)
评论
accept()
EPOLLIN
select()
readfds
read()
EPOLLIN
仅表示套接字处于可读状态。当侦听套接字具有要接受的挂起连接时,它处于可读状态。