是否可以在 C 中获取文件描述符(Linux)的文件名?
原文由 adk 发布,翻译遵循 CC BY-SA 4.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 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答799 阅读✓ 已解决
1 回答3.3k 阅读
您可以在 ---
readlink
上使用/proc/self/fd/NNN
,其中 NNN 是文件描述符。这将为您提供文件打开时的名称——但是,如果文件从那时起被移动或删除,它可能不再准确(尽管 Linux 在某些情况下可以跟踪重命名)。 To verify,stat
the filename given andfstat
the fd you have, and make surest_dev
andst_ino
are the same.当然,并非所有文件描述符都引用文件,对于那些您会看到一些奇怪的文本字符串,例如
pipe:[1538488]
。由于所有真实文件名都是绝对路径,因此您可以很容易地确定哪些是绝对路径。此外,正如其他人所指出的,文件可以有多个指向它们的硬链接——这只会报告打开它的那个。如果要查找给定文件的所有名称,则只需遍历整个文件系统。