在select系统调用中是否有必要重置fd_set?

9
我在使用Unix的select函数时遇到了问题。
我有一个服务器在等待连接。首先,我使用FD_SET(listener, readfds)将监听套接字文件描述符listener添加到fd_set readfds中,然后在select()中使用它。
当我收到连接时,我调用accept()并使用接受的文件描述符设置select中的readfds,并开始从连接接收数据。但是,当我在strace中检查代码时,在第二次执行select()时,select在readfds中不显示监听器。
在再次调用select()之前,我需要再次使用FD_SET(listener, readfds)来设置监听器文件描述符吗?
谢谢。

另外请注意,在Linux上超时值可以被修改,因此也需要重新初始化。标准允许这样做,但在其他版本的Unix中并不常见。 - Chris Stratton
2个回答

14

是的(在select()系统调用之间需要重置fd_set)。

这很麻烦,但它们充当输入/输出参数,被系统调用读取并修改。当select()返回时,这些值都已被修改以反映准备好的文件描述符集。因此,在每次调用select()之前,您必须重新初始化fd_set值。


3

乔纳森是正确的。 您每次需要执行以下操作:

set readFDs
set writeFDs
set errorFDs
select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接