我在进行自动化软件测试时遇到问题,这是我指责在fd中使用close(3)之后再使用fd_clr(3)时使用释放的资源。这样做有什么问题吗?
for(i = 0; i < nfds; ++i) {
if (FD_ISSET(i, &myFdSet)) {
close(i);
FD_CLR(i, &myFdSet);
}
}
答案 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_CLR
和close()
,这不会改变代码的含义,但可以使多虫的分析工具安逸。