从C中的文件描述符中检索文件名

新手上路,请多包涵

是否可以在 C 中获取文件描述符(Linux)的文件名?

原文由 adk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 840
2 个回答

您可以在 --- readlink 上使用 /proc/self/fd/NNN ,其中 NNN 是文件描述符。这将为您提供文件打开时的名称——但是,如果文件从那时起被移动或删除,它可能不再准确(尽管 Linux 在某些情况下可以跟踪重命名)。 To verify, stat the filename given and fstat the fd you have, and make sure st_dev and st_ino are the same.

当然,并非所有文件描述符都引用文件,对于那些您会看到一些奇怪的文本字符串,例如 pipe:[1538488] 。由于所有真实文件名都是绝对路径,因此您可以很容易地确定哪些是绝对路径。此外,正如其他人所指出的,文件可以有多个指向它们的硬链接——这只会报告打开它的那个。如果要查找给定文件的所有名称,则只需遍历整个文件系统。

原文由 bdonlan 发布,翻译遵循 CC BY-SA 3.0 许可协议

我在 Mac OS X 上遇到了这个问题。我们没有 /proc 虚拟文件系统,所以接受的解决方案无法工作。

相反,我们有一个 F_GETPATH 命令用于 fcntl

  F_GETPATH          Get the path of the file descriptor Fildes.  The argu-
                    ment must be a buffer of size MAXPATHLEN or greater.

因此,要获取与文件描述符关联的文件,您可以使用以下代码段:

 #include <sys/syslimits.h>
#include <fcntl.h>

char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
    // do something with the file path
}

因为我不记得 MAXPATHLEN 是在哪里定义的,所以我认为来自 syslimits 的 PATH_MAX 会很好。

原文由 zneak 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题