是否有必要重置select系统调用之间的fd_set?

我在Unix中使用select函数面临一个问题。

我有一个等待连接的服务器。 首先,我使用FD_SET(listener, readfds)将侦听套接字文件描述符listener添加到fd_set readfds ,然后在select()使用它。

当我得到一个连接时,我调用accept()并将readfds中的readfds设置为接受的文件描述符,并开始接收来自连接的数据。 但是,当我在strace中检查代码时, select()在第二次执行时select()不显示readfds的监听器。

在再次调用select()之前FD_SET(listener, readfds)是否需要使用FD_SET(listener, readfds)再次设置侦听器文件描述符?

谢谢。

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

这是一个滋扰,但他们作为输入/输出参数; 它们被系统调用读取和修改。 当select()返回时,所有值都被修改以反映准备好的文件描述符集。 所以,每次调用select() ,都必须(重新)初始化fd_set值。

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

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