Linux C语言根据文件描述符fd获得文件绝对路径(文件名)

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

一、代码示例

示例代码首先根据文件名获取文件描述符,然后根据文件描述符获得文件绝对路径(文件名),如果已知文件描述符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

从上述示例中,可以看到其中的核心函数主要有两个:

  1. snprintf
  2. 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

https://blog.csdn.net/feixue0000/article/details/14167333

http://doc.okbase.net/u011641885/archive/158733.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值