是否可以在C中获取文件描述符(Linux)的文件名?
是否可以在C中获取文件描述符(Linux)的文件名?
Answers:
您可以使用readlink
在/proc/self/fd/NNN
其中NNN是文件描述符。这将为您提供文件打开时的名称-但是,如果从那时起文件已被移动或删除,它可能就不再准确了(尽管Linux在某些情况下可以跟踪重命名)。要进行验证,stat
请提供给定的文件名和fstat
fd,并确保st_dev
和st_ino
相同。
当然,并非所有文件描述符都引用文件,对于那些文件描述符,您会看到一些奇怪的文本字符串,例如pipe:[1538488]
。由于所有真实文件名都是绝对路径,因此您可以轻松确定其中的哪个。此外,正如其他人指出的那样,文件可以有多个指向它们的硬链接-这只会报告打开文件的那个。如果要查找给定文件的所有名称,则只需遍历整个文件系统。
fd
就是这样的引用),则无法重用inode编号。关闭文件后或打开文件之前使用inode编号的任何软件本质上都受竞争条件的影响。
setuid()
花招,则可能/proc/self/fd
无法被您的过程访问。请参阅:permalink.gmane.org/gmane.linux.kernel/1302546
我在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
定义,所以我认为PATH_MAX
从syslimits可以。
getsockname
。
在Windows中,通过GetFileInformationByHandleEx传递FileNameInfo,您可以检索文件名。
正如泰勒(Tyler)指出的那样,由于给定的FD可能对应0个文件名(在各种情况下)或> 1(多个“硬链接”通常是对后一种情况的描述),因此无法“直接且可靠地”执行所需的操作)。如果您仍然需要具有所有限制的功能(在速度上以及获得0、2,...而不是1的可能性),则可以按照以下方法进行操作:首先,fstat将FD告诉您- ,结果struct stat
是文件驻留在什么设备上,它具有多少个硬链接,它是否是特殊文件等。这可能已经回答了您的问题-例如,如果您知道0个硬链接,那么实际上没有相应的文件名在磁盘上。
如果统计数据给了您希望,那么您就必须在相关设备上“遍历目录”,直到找到所有硬链接(或者只有第一个硬链接,如果不需要多个,那么任何一个都可以) )。为此,您使用readdir(当然还有opendir&c)以递归方式打开子目录,直到在struct dirent
由此收到的inode号中找到与原始目录相同的inode号为止。struct stat
(此时您需要的是整个路径,而不仅仅是名称,您需要向后移动目录链以进行重构)。
如果可以接受这种通用方法,但是您需要更详细的C代码,请告诉我们,这将很容易编写(尽管如果它没有用,我宁愿不编写它,即您无法忍受不可避免的缓慢性能或就您的应用而言,有可能获得!= 1个结果;-)。
不可能。文件描述符在文件系统中可能具有多个名称,也可能根本没有名称。
编辑:假设您正在谈论的是普通的旧POSIX系统,没有任何特定于操作系统的API,因为您没有指定操作系统。