linux c 通過檔案描述符獲取檔名
阿新 • • 發佈:2019-02-07
在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;
}