猿问

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

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



鸿蒙传说
浏览 458回答 3
3回答

一只萌萌小番薯

我在MacOSX上有这个问题。我们没有/proc虚拟文件系统,因此接受的解决方案无法工作。相反,我们有一个F_GETPATH命令fcntl:&nbsp;F_GETPATH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get&nbsp;the&nbsp;path&nbsp;of&nbsp;the&nbsp;file&nbsp;descriptor&nbsp;Fildes.&nbsp;&nbsp;The&nbsp;argu- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ment&nbsp;must&nbsp;be&nbsp;a&nbsp;buffer&nbsp;of&nbsp;size&nbsp;MAXPATHLEN&nbsp;or&nbsp;greater.因此,要获取与文件描述符关联的文件,可以使用以下代码段:#include&nbsp;<sys/syslimits.h>#include&nbsp;<fcntl.h>char&nbsp;filePath[PATH_MAX];if&nbsp;(fcntl(fd,&nbsp;F_GETPATH,&nbsp;filePath)&nbsp;!=&nbsp;-1){ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;something&nbsp;with&nbsp;the&nbsp;file&nbsp;path}因为我不记得在哪里MAXPATHLEN被定义了,我想PATH_MAX从塞斯菲尔德来就可以了。

跃然一笑

正如泰勒所指出的,没有办法“直接和可靠地”完成所需的工作,因为给定的FD可能对应于0文件名(在各种情况下)或>1(后一种情况通常是由多个“硬链接”描述的)。如果您仍然需要有所有限制的功能(在速度和获得0,2的可能性上),.结果,而不是1),这是你能做到的方法:首先,fstat这个FD-这告诉你,在结果struct stat文件是在什么设备上运行的,它有多少硬链接,是否是一个特殊的文件等等。这可能已经回答了您的问题-例如,如果0硬链接,您就会知道磁盘上实际上没有相应的文件名。如果数据给了你希望,那么你必须在相关设备上的目录“遍历树”,直到你找到所有硬链接(或者仅仅是第一个链接,如果你不需要超过一个并且任何一个都会做到)。为此,你用雷迪尔(当然,还有opendir&c)递归打开子目录,直到在struct dirent因此,接收到的inode号与原来的inode编号相同。struct stat(此时,如果您想要整个路径,而不仅仅是名称,则需要向后遍历目录链以重构它)。如果这个一般的方法是可以接受的,但是您需要更详细的C代码,那么请告诉我们,编写它并不困难(尽管如果它是无用的,我宁愿不写它,也就是说,您无法承受不可避免的缓慢性能,或者为了您的应用程序而获得!=1结果的可能性;-)。
随时随地看视频慕课网APP
我要回答