1. 程式人生 > >linux c 通過檔案描述符獲取檔名

linux c 通過檔案描述符獲取檔名

在linux中每個被開啟的檔案都會在/proc/self/fd/目錄中有記錄,其中(/proc/self/fd/檔案描述符號;這個檔案是符號檔案)的檔案就是檔案描述符所對應的檔案。
而readlink可以取得符號連線所指的檔案
函式原型:

ssize_t 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路徑中的目錄存在但卻非真正的目錄。

通過檔案描述符獲取檔名原始碼:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h> const char *FILE_NAME = "a.txt"; int main(){ int fd; if((fd = open(FILE_NAME, O_RDONLY)) == -1){ fprintf(stderr,"%s open :%s\n",FLOW_RX_FILE, strerror(errno)); return -1; } char buf[1024] = {'\0'}; char file_path[1024] = {'\0'}; snprintf
(buf,sizeof(buf), "/proc/self/fd/%d", fd); readlink(buf,file_path,sizeof(file_path)-1); printf("%s\n",file_path); return 0; }