我有文件描述符,在我的信号处理程序中,我关闭了文件。但由于其他条件,该文件可能已提前关闭。有没有办法检查文件描述符是否指向 c 和 linux 中的打开文件?
更新:是否可以确定与文件描述符关联的文件名?这样,如果 fd 被回收,应用程序可以检测到它。
尝试对文件描述符进行任何文件操作lseek
。如果它返回-1
. 然后检查errno
,如果是,EBADF
则文件描述符已经关闭。
尝试以lseek
不受影响的方式进行,如下所示。
lseek(fd, 0, SEEK_CUR);
通常在程序中打开第一个文件时,我们总是将文件描述符作为3
. 关闭此文件后,如果我们尝试打开其他文件,我们将获得与3
. 因为我们总是会得到最低的可用数字。如果我们在一个程序中关闭和重新打开许多文件,那么我们需要改进我们的代码来跟踪文件描述符列表以检查它是否关闭。
fd
在您关闭分配给它的文件描述符之后-1
,您可以稍后进行测试fd
以-1
查看您是否已经关闭它。
readlink()
您可以通过调用来查找(有效)文件描述符引用的文件名/proc/<pid>/fd/<file descriptor>
。
当您打开一个文件时,它总是得到分配的最小可用 fd。因此,如果您关闭 fd,然后在代码中的某个位置打开另一个文件,您可以轻松地将相同的 fd 重新分配给这个新文件。所以没有可靠的方法来判断文件描述符是否已关闭,因为它现在可以指向另一个打开的文件。