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