关闭 [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
,这不会改变代码的含义,但会安抚错误分析工具。
我在自动软件测试中遇到问题,当我在 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
,这不会改变代码的含义,但会安抚错误分析工具。