为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小唯快跑啊 2019-07-13 10:44:45
是否可以在C中获取文件描述符(Linux)的文件名?
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我在MacOSX上有这个问题。我们没有/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被定义了,我想PATH_MAX从塞斯菲尔德来就可以了。


查看完整回答
反对 回复 2019-07-13
?
湖上湖

TA贡献2003条经验 获得超2个赞

正如泰勒所指出的,没有办法“直接和可靠地”完成所需的工作,因为给定的FD可能对应于0文件名(在各种情况下)或>1(后一种情况通常是由多个“硬链接”描述的)。如果您仍然需要有所有限制的功能(在速度和获得0,2的可能性上),.结果,而不是1),这是你能做到的方法:首先,fstat这个FD-这告诉你,在结果struct stat文件是在什么设备上运行的,它有多少硬链接,是否是一个特殊的文件等等。这可能已经回答了您的问题-例如,如果0硬链接,您就会知道磁盘上实际上没有相应的文件名。

如果数据给了你希望,那么你必须在相关设备上的目录“遍历树”,直到你找到所有硬链接(或者仅仅是第一个链接,如果你不需要超过一个并且任何一个都会做到)。为此,你用雷迪尔(当然,还有opendir&c)递归打开子目录,直到在struct dirent因此,接收到的inode号与原来的inode编号相同。struct stat(此时,如果您想要整个路径,而不仅仅是名称,则需要向后遍历目录链以重构它)。

如果这个一般的方法是可以接受的,但是您需要更详细的C代码,那么请告诉我们,编写它并不困难(尽管如果它是无用的,我宁愿不写它,也就是说,您无法承受不可避免的缓慢性能,或者为了您的应用程序而获得!=1结果的可能性;-)。


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 781 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信