我在使用 Unix 中的 select 函数时遇到问题。
我有一个等待连接的服务器。首先,我使用 FD_SET(listener, readfds)
将监听套接字文件描述符 listener
添加到 fd_set readfds
,然后在 中使用它选择()
。
当我获得连接时,我调用accept()
并使用已接受的文件描述符在select 中设置readfds
并开始从连接接收数据。但是,当我检查 strace 中的代码时,当 select()
第二次执行时,select 不会在 readfds
中显示监听器。
在再次调用 select()
之前,是否需要使用 FD_SET(listener, readfds)
再次设置监听器文件描述符?
谢谢。
最佳答案
是的(需要在select()
系统调用之间重置fd_set
)。
这很麻烦,但它们充当输入/输出参数;它们由系统调用读取和修改。当select()
返回,所有值都已修改以反射(reflect)准备好的文件描述符集。因此,每次调用 select()
之前,您都必须(重新)初始化 fd_set
值。
关于c - 是否有必要在 select 系统调用之间重置 fd_set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4563577/