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