是否将选择放在fd_set中之前已关闭的描述符?

时间:2019-03-06 20:21:12

标签: c select

如果将连接描述符放入select系统调用中使用的rdset中时,客户端将关闭该描述符,以便在调用select时该描述符已经关闭,则仍将其选中并对其进行读/写操作返回0?

还是它将保留在集合中并且永远不会被选中?

2 个答案:

答案 0 :(得分:1)

POSIX select()  需要关闭的文件描述符来生成错误:

  

错误

     

在以下情况下,pselect()select()将失败,并将errno设置为:

     

[EBADF]
  一个或多个文件描述符集指定的文件描述符不是有效的打开文件描述符。

答案 1 :(得分:1)

  

如果我在选择中使用的rdset中放置了连接描述符   syscall客户端关闭该描述符,因此在关闭时已关闭   选择被调用,它将仍然被选择并对其进行读/写   返回0?

     

还是它将保留在集合中并且永远不会被选中?

可能两者都不是。最可能的结果是select()调用失败,返回-1并将errno设置为EBADFPer POSIX,这表明

  

一个或多个文件描述符集指定的文件描述符不是有效的打开文件描述符。

The Linux manual page for select(2)给出了已关闭的文件描述符,作为不良文件描述符的特定示例。 但是,Linux手册还记录了一个错误,即Linux select()忽略提供的fdset中的FD,该FD大于该进程当前打开的FD。这样,在Linux上,您不能依靠select()导致失败,但是如果select()没有失败,那么它将永远不会选择有问题的文件描述符。