我在 Unix 中使用 select 函数时遇到问题。
我有一个等待连接的服务器。首先,我使用
listener
将侦听套接字文件描述符 readfds
添加到 fd_set FD_SET(listener, readfds)
,然后在 select()
中使用它。
当我获得连接时,我调用
accept()
并使用接受的文件描述符在 select 中设置 readfds
并开始从连接接收数据。但是,当我检查 strace 中的代码时,当 readfds
第二次执行时,选择不会在 select()
中显示侦听器。
在再次调用
FD_SET(listener, readfds)
之前,是否需要使用 select()
再次设置监听器文件描述符?
是(需要在
fd_set
系统调用之间重置 select()
)。
这很麻烦,但它们充当输入/输出参数;它们由系统调用读取和修改。当
select()
返回时,所有值都已被修改以反映准备好的文件描述符集。因此,每次调用 select()
之前,您都必须(重新)初始化 fd_set
值。
乔纳森是对的。您每次都需要执行以下操作:
set readFDs
set writeFDs
set errorFDs
select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout)