Linux C語言根據文件描述符fd獲得文件絕對路徑(文件名)

一、代碼示例

示例代碼首先根據文件名獲取文件描述符,然後根據文件描述符獲得文件絕對路徑(文件名),如果已知文件描述符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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章