【问题标题】:Is it necessary to reset the fd_set between select system call?是否需要在 select 系统调用之间重置 fd_set?
【发布时间】:2011-06-01 14:30:51
【问题描述】:

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

我有一个等待连接的服务器。首先,我使用FD_SET(listener, readfds) 将监听套接字文件描述符listener 添加到fd_set readfds,然后在select() 中使用它。

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

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

谢谢。

【问题讨论】:

  • 在 Linux 上也不能修改超时值,因此也需要重新初始化。该标准允许这样做,但在其他风格的 unix 中并不常见。

标签: c unix


【解决方案1】:

是的(必须在select() 系统调用之间重置fd_set)。

这很麻烦,但它们充当输入/输出参数;它们由系统调用读取和修改。当select() 返回时,所有值都已被修改以反映准备好的文件描述符集。因此,每次调用 select() 之前,您都必须(重新)初始化 fd_set 值。

【讨论】:

    【解决方案2】:

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

    set readFDs
    set writeFDs
    set errorFDs
    select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout)
    

    【讨论】:

      猜你喜欢
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多