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

时间:2019-06-25 18:26:38

标签: c linux file 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);
    }
}

3 个答案:

答案 0 :(得分:1)

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

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

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

之所以看到FD_CLR()恰好位于close()下方,是因为不再需要/目的询问状态是否为关闭的文件描述符。

答案 1 :(得分:0)

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

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

您的代码正在询问我正在听的所有文件,请关闭该文件并从集中删除。

close()实际上关闭文件。您不应在同一文件上多次调用关闭命令,否则您将看到此错误。也许其他一些代码也正在关闭文件?

答案 2 :(得分:0)

如果该软件确实在标记使用tr_insertmerch,则表明该自动化软件已损坏。您正在从监视集中删除文件描述符,FD_CLR正是这样做的方法。

作为一种变通办法,您可以转置FD_CLRclose(),这不会改变代码的含义,但可以使多虫的分析工具安逸。