关闭 [close(3)] 和清除 [fd_clr(3)] 文件描述符有什么区别?

What is the difference between closing [close(3)] and clearing [fd_clr(3)] a file descriptor?

我在自动软件测试中遇到问题,当我在 fd 中使用 close(3) 后使用 fd_clr(3) 时,这归咎于释放资源的使用。这样做有什么问题吗?

for(i = 0; i < nfds; ++i) {
    if (FD_ISSET(i, &myFdSet)) {
        close(i);
        FD_CLR(i, &myFdSet);
    }
}

FD_CLR() 仅更改局部 fd_set,这是一个 C 数据结构,用于存储有关文件描述符列表的信息。

close()是关闭文件描述符的系统调用。

fd_set用于select()系统调用。使用 select(),您可以获得有关存储在 fd_set 结构中的文件描述符列表状态的信息。

您在 close() 下方看到 FD_CLR() 的原因是不再 need/purpose 询问状态是否已关闭文件描述符。

因此,FD_ISSET 和 FD_CLR 是 pselect API 的一部分,请在此处的手册页中阅读更多内容 http://man7.org/linux/man-pages/man3/FD_CLR.3.html

它基本上是在管理您要等待的所有文件编号的列表,在您下次调用 pselect 时,因此清除您已关闭的文件是有意义的。

您的代码要求,对于我正在侦听的所有文件,关闭文件并从集合中删除。

close() 实际上是关闭文件。你不应该在同一个文件上多次调用关闭,否则你会看到这个错误。也许其他一些代码也在关闭文件?

如果软件真的标记了 FD_CLR 的此类使用,则自动化软件已损坏。您正在从监视集中删除 关闭的文件描述符,FD_CLR 正是这样做的方法。

作为 work-around,您可以调换 close()FD_CLR,这不会改变代码的含义,但会安抚错误分析工具。