如何检查文件是否已关闭

5
我有文件描述符,在我的信号处理函数中,我关闭了该文件。但由于其他条件,该文件可能已经在之前被关闭了。在C和Linux中,有没有一种方法可以检查文件描述符是否指向打开的文件?
更新: 是否有可能确定与文件描述符相关联的文件名?这样,如果fd被回收,应用程序就可以检测到它。

你的意思是仍然由同一进程打开吗?最简单的方法是在关闭文件时将FD设置为某个空值。 - Martin Beckett
2
为什么不管EBADF的错误直接将其关闭呢?如果您知道此描述符上没有打开任何内容,则应该可以正常工作。 - zch
您无法确定与描述符相关联的文件名。 可能没有任何文件名关联。 - mpez0
这似乎与https://dev59.com/eWct5IYBdhLWcg3wHJ3F相反,但那里给出的答案对您也适用。 - Mawg says reinstate Monica
3个回答

5
尝试在文件描述符上执行任何文件操作,例如lseek。如果返回值为-1,则检查errno,如果是EBADF,则表示文件描述符已关闭。

尝试以以下不受影响的方式执行lseek

lseek(fd, 0, SEEK_CUR);

通常,在程序中打开第一个文件时,我们总是得到文件描述符3。此文件关闭后,如果我们尝试打开其他文件,我们将获得相同的文件描述符3。因为我们总是会获得最低可用的编号。如果在程序中关闭并重新打开多个文件,则需要改进代码以跟踪文件描述符列表,以检查它是否已关闭。


2

当你打开一个文件时,它总是会得到最小可用的fd分配。因此,如果你关闭了fd,然后在代码中的其他地方打开另一个文件,你很容易将相同的fd重新分配给这个新文件。因此,没有可靠的方法来确定文件描述符是否已关闭,因为它现在可能指向另一个已打开的文件。


有没有可能确定一个打开的文件描述符是否仍然指向特定的文件?或者有没有可能确定与文件描述符相关联的文件名? - Jimm
我可以考虑查看Linux中的/proc/self/fd,但不认为这是一种可靠(绝对不是可移植)的方法。 - Xeor

2

当你关闭文件描述符fd后,将其赋值为-1,以便稍后可以测试fd是否已关闭。


您可以通过调用readlink()/proc/<pid>/fd/<file descriptor>上查找文件名(有效的)文件描述符引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接