linux中通過文件描述符獲取文件絕對(duì)路徑的方法
在linux中,有時(shí)候我們只知道文件描述符卻不知道它的名字及其完整的路徑,如果我們想獲取其路徑該怎么辦呢?其實(shí)很簡單,在linux中每個(gè)被打開的文件都會(huì)在/proc/self/fd/目錄中有記錄,其中(/proc/self/fd/文件描述符號(hào))的文件就是文件描述符所對(duì)應(yīng)的文件。說道這里我們先停下了說一個(gè)函數(shù):
readlink(取得符號(hào)連接所指的文件)
相關(guān)函數(shù) stat,lstat,symlink
表頭文件 #include <unistd.h>
定義函數(shù) int readlink (const char *path, char *buf, size_t bufsiz);
函數(shù)說明 readlink()會(huì)將參數(shù)path的符號(hào)連接內(nèi)容存到參數(shù)buf所指的內(nèi)存空間,返回的內(nèi)容不是以NULL作字符串結(jié)尾,但會(huì)將字符串的字符數(shù)返回。若參數(shù)bufsiz小于符號(hào)連接的內(nèi)容長度,過長的內(nèi)容會(huì)被截?cái)唷?/p>
返回值 執(zhí)行成功則傳符號(hào)連接所指的文件路徑字符串,失敗則返回-1,錯(cuò)誤代碼存于errno。
錯(cuò)誤代碼 EACCESS 取文件時(shí)被拒絕,權(quán)限不夠
EINVAL 參數(shù)bufsiz 為負(fù)數(shù)
EIO I/O 存取錯(cuò)誤。
ELOOP 欲打開的文件有過多符號(hào)連接問題。
ENAMETOOLONG 參數(shù)path的路徑名稱太長
ENOENT 參數(shù)path所指定的文件不存在
ENOMEM 核心內(nèi)存不足
ENOTDIR 參數(shù)path路徑中的目錄存在但卻非真正的目錄。
綜合上述得出如下簡單函數(shù)來獲取文件路徑:
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 (); }
以上這篇linux中通過文件描述符獲取文件絕對(duì)路徑的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux No space left on device由索引節(jié)點(diǎn)(inode)爆滿引發(fā)500問題
這篇文章主要介紹了linux No space left on device由索引節(jié)點(diǎn)(inode)爆滿引發(fā)500問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Ubuntu部署python3.5的開發(fā)和運(yùn)行環(huán)境
這篇文章主要介紹了Ubuntu部署python3.5的開發(fā)和運(yùn)行環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01linux禁止ping的實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了linux禁止ping的實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05在Linux服務(wù)器下啟動(dòng)tomcat的三種方式
這篇文章主要介紹了在Linux服務(wù)器下啟動(dòng)tomcat的三種方式,Linux作為一種穩(wěn)定安全的服務(wù)器一直受到業(yè)界歡迎,那么如何啟動(dòng)部署在服務(wù)器上的Tomcat呢,這篇文章帶我們來了解2023-03-03