我有文件描述符,在我的信号处理函数中,我关闭了该文件。但由于其他条件,该文件可能已经在之前被关闭了。在C和Linux中,有没有一种方法可以检查文件描述符是否指向打开的文件?
更新: 是否有可能确定与文件描述符相关联的文件名?这样,如果fd被回收,应用程序就可以检测到它。
更新: 是否有可能确定与文件描述符相关联的文件名?这样,如果fd被回收,应用程序就可以检测到它。
lseek
。如果返回值为-1
,则检查errno
,如果是EBADF
,则表示文件描述符已关闭。
尝试以以下不受影响的方式执行lseek
。
lseek(fd, 0, SEEK_CUR);
通常,在程序中打开第一个文件时,我们总是得到文件描述符3
。此文件关闭后,如果我们尝试打开其他文件,我们将获得相同的文件描述符3
。因为我们总是会获得最低可用的编号。如果在程序中关闭并重新打开多个文件,则需要改进代码以跟踪文件描述符列表,以检查它是否已关闭。
当你打开一个文件时,它总是会得到最小可用的fd分配。因此,如果你关闭了fd,然后在代码中的其他地方打开另一个文件,你很容易将相同的fd重新分配给这个新文件。因此,没有可靠的方法来确定文件描述符是否已关闭,因为它现在可能指向另一个已打开的文件。
当你关闭文件描述符fd
后,将其赋值为-1
,以便稍后可以测试fd
是否已关闭。
您可以通过调用readlink()
在/proc/<pid>/fd/<file descriptor>
上查找文件名(有效的)文件描述符引用。
EBADF
的错误直接将其关闭呢?如果您知道此描述符上没有打开任何内容,则应该可以正常工作。 - zch