一、代码示例
示例代码首先根据文件名获取文件描述符,然后根据文件描述符获得文件绝对路径(文件名),如果已知文件描述符fd,可直接通过下面两条代码获得文件绝对路径(文件名):
snprintf(buf,sizeof(buf), "/proc/self/fd/%d", abs_fd);
readlink(buf,obj_file,SIZE);
obj_file 就为文件绝对路径,完整代码示例如下:
fd.c:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#define SIZE 128
int main(int argc, char* argv[])
{
int abs_fd;
char *obj_file;
obj_file = malloc(SIZE);
char buf[SIZE] = {'\0'};
if(argc != 2)
{
printf("please input the filename \n");
return 0;
}
if ((abs_fd = open(argv[1], O_RDWR | O_CREAT, 0666)) < 0)
{
perror("open file error\n");
return 0;
}
snprintf(buf,sizeof(buf), "/proc/self/fd/%d", abs_fd);
if (readlink(buf,obj_file,SIZE) < 0)
{
perror("readlink() error \n");
return 0;
}
printf("The absolute filepath is: \n%s \n",obj_file);
return 1;
}
运行:
./fd filename

从上述示例中,可以看到其中的核心函数主要有两个:
- snprintf
- readlink
二、snprintf
头文件:
#include <stdio.h>
函数原型:
int snprintf(char *str, size_t size, const char *format, ...)
说明:
将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。
snprintf(buf,sizeof(buf), "/proc/self/fd/%d", abs_fd);
在上述代码中,将文件描述符的具体信息拷贝到 buf 中,这段代码执行后buf中的内容为:
/proc/self/fd/***
其中***为具体的文件描述符,是一个整型数据。
snprintf函数执行成功则返回预写入的字符串长度,执行失败则返回负值。
三、readlink
头文件:
#include <unistd.h>
函数原型:
int readlink(const char *path, char *buf, size_t bufsiz);
说明:
readlink函数会将参数path的符号连接内容到参数buf所指的内存空间,返回的内容不是以NULL作字符串结尾,但会将字符串
的字符数返回,若参数bufsiz小于符号连接的内容长度,过长的内容会被截断。
在linux中每个被打开的文件都会在/proc/self/fd/目录中有记录,其中(/proc/self/fd/文件描述符号;这个文件是符号文件)的文件就是文件描述符所对应的文件。
而readlink可以取得符号连接所指的文件:
readlink(buf,obj_file,SIZE);
readlink函数执行成功则传符号连接所指的文件路径字符串,执行失败返回 -1。
参考:
http://blog.chinaunix.net/uid-20498361-id-1940235.html

本文介绍了如何在Linux系统中,使用C语言通过文件描述符获取文件的绝对路径。核心方法包括snprintf和readlink函数的使用。示例代码展示了从文件描述符到文件路径的转换过程。
1193

被折叠的 条评论
为什么被折叠?



