【发布时间】:2014-12-22 20:00:26
【问题描述】:
有没有办法从文件句柄中获取真实路径(即没有任何“/../”、“/./”序列、符号链接等的绝对路径)?我知道 POSIX 有 realpath() 函数,但这不接受文件句柄。它改为使用文件名(字符串)。我需要一个函数来接受由fopen() 分配的stdio FILE* 句柄或由open() 分配的文件描述符,并返回该文件的真实路径。
这样的东西存在吗?或者有没有其他方法可以从 FILE* 句柄或 POSIX 文件描述符中获取完全限定的路径?
【问题讨论】:
-
嗯,我怀疑,因为文件不需要有路径或只有一个路径......
-
所有你想要的都是文件系统实现的一部分,而不是 POSIX C。虽然你可以使用 C 编写它。这意味着如何做到这一点是平台特定的,像 lsof 和 fuser 这样的程序是为特定的操作系统。如果你想要一些便携的东西,你有很多工作要做。如果文件仍然存在并且不是普通文件。
-
“
FILE *”变体将通过使用fileno(fp)调用文件描述符变体来处理。但由于文件描述符可能用于套接字、已删除文件、普通管道或其他此类无名“文件”,frealpath()函数并不是一个真正的选项——这就是它没有提供的原因。请注意,即使系统被要求记录与open()或creat()一起使用的名称,但在您尝试访问它时,该名称可能已被重用。至少,您必须使用fstat()和stat()并比较 inode 编号和持有设备编号。 -
有什么理由你不能只跟踪你用来打开文件的文件名并使用它?