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

时间:2010-12-30 14:54:45

标签: c unix

我在使用Unix中的select函数时遇到了问题。

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

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

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

感谢。

2 个答案:

答案 0 :(得分:12)

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

这是令人讨厌的,但它们充当输入/输出参数;它们由系统调用读取并修改。当select()返回时,所有值都已被修改以反映准备好的文件描述符集。因此,每次拨打select()之前,您都必须(重新)初始化fd_set值。

答案 1 :(得分:3)

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

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