【问题标题】:how to check if the file is closed如何检查文件是否关闭
【发布时间】:2013-01-15 17:58:33
【问题描述】:

我有文件描述符,在我的信号处理程序中,我关闭了文件。但由于其他条件,该文件可能已提前关闭。有没有办法检查文件描述符是否指向c和linux中打开的文件?

更新: 是否可以确定与文件描述符关联的文件名?这样,如果 fd 被回收,应用程序可以检测到它。

【问题讨论】:

标签: c linux


【解决方案1】:

尝试对文件描述符执行任何文件操作,例如lseek。如果它返回-1。然后检查errno,如果是EBADF,那么文件描述符已经关闭了。

尝试以不受影响的方式执行lseek,如下所示。

lseek(fd, 0, SEEK_CUR);

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

【讨论】:

    【解决方案2】:

    在您关闭文件描述符fd 后,将-1 分配给它,以便您稍后可以针对-1 测试fd 以查看您是否已经关闭它。


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

    【讨论】:

      【解决方案3】:

      当您打开一个文件时,它总是得到分配的最小可用 fd。因此,如果您关闭 fd,然后在代码中的某个位置打开另一个文件,您可以轻松地将相同的 fd 重新分配给这个新文件。所以没有可靠的方法来判断文件描述符是否已关闭,因为它现在可以指向另一个打开的文件。

      【讨论】:

      • 是否可以确定打开的 fd 是否仍指向特定文件?或者是否可以确定与 fd 关联的文件名?
      • 我可以考虑在 Linux 中查看 /proc/self/fd,但不认为它是可靠的(而且绝对不是可移植的)方式。
      猜你喜欢
      • 1970-01-01
      • 2019-02-16
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2017-02-22
      • 1970-01-01
      • 2011-09-29
      相关资源
      最近更新 更多