Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从文件描述符或文件*检索路径?_C - Fatal编程技术网

C 从文件描述符或文件*检索路径?

C 从文件描述符或文件*检索路径?,c,C,有没有办法从文件描述符或文件指针检索路径信息 我知道,对于文件描述符是套接字、管道等的情况,这些数据可能并不总是相关/有用的。我不相信有任何可移植的方法,但例如,在Linux上,您可以调用上的readlink“/proc/self/fd/fileno”,如果可以,内核会给您一个路径,如果不是,也可以是各种看起来很滑稽的字符串。一个文件可以有一个或多个名称,因此没有std方法。 我不确定是否有特定于操作系统的东西。如果您有幸使用Mac OS X,您可以使用以下代码: #define _DARWIN

有没有办法从文件描述符或文件指针检索路径信息


我知道,对于文件描述符是套接字、管道等的情况,这些数据可能并不总是相关/有用的。

我不相信有任何可移植的方法,但例如,在Linux上,您可以调用
上的
readlink
“/proc/self/fd/
fileno
,如果可以,内核会给您一个路径,如果不是,也可以是各种看起来很滑稽的字符串。

一个文件可以有一个或多个名称,因此没有std方法。
我不确定是否有特定于操作系统的东西。

如果您有幸使用Mac OS X,您可以使用以下代码:

#define _DARWIN_C_SOURCE
#include <sys/fcntl.h>
.
.
.
char pathbuf[PATH_MAX];
if (fcntl(fd, F_GETPATH, pathbuf) >= 0) {
    // pathbuf now contains *a* path to the open file descriptor
}
\define\u DARWIN\u C\u源代码
#包括
.
.
.
char pathbuf[PATH_MAX];
如果(fcntl(fd,F_GETPATH,pathbuf)>=0){
//pathbuf现在包含指向打开文件描述符的*a*路径
}

请注意,返回的路径不一定是用于打开文件的路径。。。特别是如果存在硬链接,那么返回的路径将是文件的有效路径。

很酷,但不要将其与readlink()C函数混淆,该函数在符号链接末尾读取文件内容。看起来我可以一边扫描文件系统打开的文件,一边比较inode。当然,这样做是绝对不明智的,正如学习者提到的,没有办法知道遇到的第一个文件可能是许多硬链接中的一个。我怀疑更简单、更有效的方法是只将初始路径变量外部化。@Don:这是readlink()C函数,它读取符号链接目标的名称,而不是内容。
readlink()
适用于符号链接:它以路径名的形式提供链接目标。@hobbs:我的错误。我不知道我在想什么API。