我在使用Unix中的select函数时遇到了问题。
我有一台等待连接的服务器。首先,我使用listener
将侦听套接字文件描述符readfds
添加到fd_set FD_SET(listener, readfds)
,然后在select()
中使用它。
当我获得连接时,我调用accept()
并使用接受的文件描述符将readfds
设置为select并开始从连接接收数据。但是,当我检查strace中的代码时,当readfds
正在执行第二次时,select不会显示select()
中的侦听器。
在再次调用FD_SET(listener, readfds)
之前,是否需要使用select()
再次设置侦听器文件描述符?
感谢。
答案 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)