linux中通過檔案描述符獲取檔案絕對路徑

2021-08-27 12:55:13 字數 1402 閱讀 9981

linux中通過檔案描述符獲取檔案絕對路徑

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

readlink(取得符號連線所指的檔案)

相關函式 stat,lstat,symlink

表頭檔案 #include

定義函式 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)

char buf[1024] = ;

char file_path[path_max] = ; // 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 ();

}

linux檔案描述符

本文介紹了檔案描述符,1 首先說什麼是檔案描述符,它有什麼作用?檔案描述符是乙個簡單的整數,用以標明每乙個被程序所開啟的檔案和socket。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案,並指定訪問該檔案的方式,呼叫成功後返回乙個檔案描述符。creat 開啟乙個檔案,如果該檔案不存在,則建立它...

linux檔案描述符

當某個程式開啟檔案時,作業系統返回相應的檔案描述符,程式為了處理該檔案必須引用此描述符。所謂的檔案描述符是乙個低階的正整數。最前面的三個檔案描述符 0,1,2 分別與標準輸入 stdin 標準輸出 stdout 和標準錯誤 stderr 對應。因此,函式 scanf 使用 stdin,而函式 pri...

Linux 檔案描述符

我們之前就知道在linux作業系統下 一切皆檔案 所以在這個條件下,所有研究的物件都變相的相當於研究檔案,那麼對檔案系統的研究也應該是必須的。我們的核心利用檔案描述符來訪問檔案,每個檔案描述符都是非負整數,開啟現存的檔案或者是新建檔案時,核心會返回乙個檔案描述符,讀寫檔案也需要使用檔案描述符來指定待...