select系统调用之间是否需要重置fd_set?
我在 Unix 中使用 select 函数时遇到问题。
我有一台等待连接的服务器。首先,我使用 FD_SET(listener, readfds) 将侦听套接字文件描述符 listener
添加到 fd_set readfds
,然后在 中使用它选择()。
当我获得连接时,我调用 accept()
并使用接受的文件描述符在 select 中设置 readfds
并开始从连接接收数据。但是,当我检查 strace 中的代码时,当 select()
再次执行时,select 不会在 readfds
中显示侦听器。
在再次调用 select()
之前,是否需要使用 FD_SET(listener, readfds)
再次设置侦听器文件描述符?
I am facing a problem using the select function in Unix.
I have a server that waits for for a connection. First I add the listening socket file descriptor listener
to the fd_set readfds
using FD_SET(listener, readfds)
and then I use that in select()
.
When I get a connection, I call accept()
and set the readfds
in select with the accepted file descriptor and start receiving the data from connection. However, when I check the code in strace, The select doesn't show the listener in the readfds
while select()
is executing a second time.
Do I need to set the listener file descriptor again using FD_SET(listener, readfds)
before calling select()
again?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是的(需要在
select()
系统调用之间重置fd_set
)。这很麻烦,但它们充当输入/输出参数;它们由系统调用读取和修改。当
select()
返回时,值已全部修改以反映文件描述符集已准备就绪。因此,每次调用select()
之前,您都必须(重新)初始化fd_set
值。Yes (it is necessary to reset the
fd_set
betweenselect()
system calls).It is a nuisance, but they act as input/output parameters; they are read by and modified by the system call. When
select()
returns, the values have all been modified to reflect the set of file descriptors ready. So, every time before you callselect()
, you have to (re)initialize thefd_set
values.乔纳森是对的。您每次都需要执行以下操作:
Jonathan is correct. You need to do the following everytime: