我正在编写单元测试,我正在尝试找到一种方法来测试我的类是否正确关闭了文件句柄(它使用了旧式的open()和close())。理想情况下,我希望能够在不访问实际句柄的情况下执行此操作 - 我希望能够检查文件系统中的文件并确定它当前是否在其他位置打开。
我试过通过独占文件锁来做,但我运气不好。此外,文件锁非常不是跨平台的(这需要在Solaris,Linux和Windows上运行)。
有什么建议吗?
答案 0 :(得分:2)
如果你想知道文件系统中的给定文件是否由机器上的某个进程打开,那么有一个名为lsof的有用工具可以告诉你各种unix和unix类系统。
答案 1 :(得分:1)
无法检查文件句柄是否仍处于打开状态。
如果你正在使用C ++,你可以简单地使用RAII,你不必担心未封闭的文件句柄。
否则,您永远不能调用系统API,而是调用您的包装器API。每次打开时都可以添加向量的路径,关闭的所有内容都可以删除该路径。最后,检查你的载体上是否有零大小。
答案 2 :(得分:1)
您可以使用select
和poll
进行检查。如果文件描述符已关闭,则Select将返回EBADF
:
fd_set rfds;
struct timeval tv = { 0, 1 };
int retval;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
retval = select(1, &rfds, NULL, NULL, &tv);
if (retval == -1 && errno == EBADF)
// File is closed
注意我没有测试过这段代码,但文档说明了这一点。
此外,这并不完全准确,因为errno也可能因为不同的原因而成为EBADF。
编辑:另一件事:如果你在关闭另一个文件之后立即打开一个文件,它很可能与前一个文件具有相同的fd,所以如果你想检查所有文件是否已经关闭,这只能是半合适的。
答案 3 :(得分:1)
在Unix / Solaris / Linux中,如果您知道pid,则可以检查/proc/
pid /fd/*
。您还可以扫描所有/ proc / * / fd条目。
对于Windows,我将研究一下现在称为Process Monitor的sysinternals.com工具ProcMon。我不记得以前是否有可用的源代码。
答案 4 :(得分:0)
如果您依赖于打开\关闭这样的文件,这不是一个合适的单元测试 - 这样的测试可能由于各种原因而随机失败,导致误报和一般混淆。
相反,请考虑抽象出文件操作并确保在您的文件表示上调用close。