select系统调用之间是否需要重置fd_set?

问题描述 投票:0回答:2

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

我有一个等待连接的服务器。首先,我使用

listener
将侦听套接字文件描述符
readfds
添加到 fd_set
FD_SET(listener, readfds)
,然后在
select()
中使用它。

当我获得连接时,我调用

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

在再次调用

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

c unix posix-select
2个回答
14
投票

是(需要在

fd_set
系统调用之间重置
select()
)。

这很麻烦,但它们充当输入/输出参数;它们由系统调用读取和修改。当

select()
返回时,所有值都已被修改以反映准备好的文件描述符集。因此,每次调用
select()
之前,您都必须(重新)初始化
fd_set
值。


3
投票

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

set readFDs
set writeFDs
set errorFDs
select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout)
© www.soinside.com 2019 - 2024. All rights reserved.