歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux中通過文件描述符獲取文件絕對路徑

Linux中通過文件描述符獲取文件絕對路徑

日期:2017/2/28 14:35:09   编辑:Linux教程

在Linux中,有時候我們只知道文件描述符卻不知道它的名字及其完整的路徑,如果我們想獲取其路徑該怎麼辦呢?其實很簡單,在Linux中每個被打開的文件都會在/proc/self/fd/目錄中有記錄,其中(/proc/self/fd/文件描述符號)的文件就是文件描述符所對應的文件。說道這裡我們先停下了說一個函數:

readlink(取得符號連接所指的文件)
相關函數 stat,lstat,symlink

表頭文件 #include <unistd.h>
定義函數 int readlink (const char *path, char *buf, size_t bufsiz);

函數說明 readlink()會將參數path的符號連接內容存到參數buf所指的內存空間,返回的內容不是以NULL作字符串結尾,但會將字符串的字符數返回。若參數bufsiz小於符號連接的內容長度,過長的內容會被截斷。

返回值 執行成功則傳符號連接所指的文件路徑字符串,失敗則返回-1,錯誤代碼存於errno。

錯誤代碼 EACCESS 取文件時被拒絕,權限不夠

EINVAL 參數bufsiz 為負數
EIO I/O 存取錯誤。
ELOOP 欲打開的文件有過多符號連接問題。
ENAMETOOLONG 參數path的路徑名稱太長
ENOENT 參數path所指定的文件不存在
ENOMEM 核心內存不足
ENOTDIR 參數path路徑中的目錄存在但卻非真正的目錄。

綜合上述得出如下簡單函數來獲取文件路徑:

std::string get_file_name (const int fd)
{
if (0 >= fd) {
return std::string ();
}

char buf[1024] = {'\0'};
char file_path[PATH_MAX] = {'0'}; // PATH_MAX in limits.h
snprintf(buf, sizeof (buf), "/proc/self/fd/%d", fd);
if (readlink(buf, file_path, sizeof(file_path) - 1) != -1) {
return std::string (file_path);
}

return std::string ();
}

Copyright © Linux教程網 All Rights Reserved