linux下檔案描述符的檢視及分析

2021-09-08 22:31:10 字數 2013 閱讀 9738

檔案操作比較通用的就是c庫的file(帶緩衝的檔案流),也就是常用的fopen, fclose, fprintf, fscanf, fseek, fread, fwrite等函式。這裡面比較核心的概念是file結構,這是c庫提供的跨平台的檔案操作函式,多數情況下是封裝了系統核心提供的檔案讀寫函式,比如在windows下是createfile, closefile, openfile, writefile, readfile等函式,在linux下是open, close, lseek, read, write等核心api。

在linux下核心api主要提供了基於檔案描述(fd,file descriptor)的檔案操作機制,注意fd預設是非負的,通常0-stdin、1-stdout、2-stderr。

先看看如何實現file到fd的轉換,函式fileno可以實現這種轉換,原型如下:

int fileno(file *stream);
那麼fd如何轉換為file呢? 函式fdopen可以基於fd開啟檔案,原型如下:

file *fdopen(int fd, const char *mode);
那麼如何通過fd拿到檔案原始路徑呢? 函式readlink提供了這種機制,可以參考下面**

#include #include #include #include #include #include #include #include int main()

int fd = fileno(stream);

char buf[4096] = ;

// read to file end

while (read(fd, buf, sizeof(buf)) > 0);

// test whether lseek is ok in eof

off_t offset = lseek(fd, 0, seek_cur);

printf("lseek ret %d err_no %d\n", offset, errno);

// read file path from fd

char path[path_max] = ;

snprintf(path, sizeof(path), "/proc/%d/fd/%d", getpid(), fd);

memset(buf, 0, sizeof(buf));

int buf_size = readlink(path, buf, sizeof(buf));

if (buf_size < 0)

else

printf("readlink() returned '%s' for '%s'\n", buf, path);

getchar();

if (null != stream)

fclose(stream);

return 0;

}

/proc/11203/fd$ ll

總用量 0

dr-x------ 2 root root 0 4月 1 15:48 ./

dr-xr-xr-x 9 root root 0 4月 1 15:48 ../

lrwx------ 1 root root 64 4月 1 15:48 0 -> /dev/pts/22

lrwx------ 1 root root 64 4月 1 15:48 1 -> /dev/pts/22

lrwx------ 1 root root 64 4月 1 15:48 2 -> /dev/pts/22

lr-x------ 1 root root 64 4月 1 15:48 3 -> /home/tocy/project/test.cpp

了解下系統提供的檔案操作介面還是不錯的,以後遇到問題最起碼知道去**跟蹤。

主要參考:

linux使用者手冊

Linux 下檔案描述符(二)

程式設計中應該使用中定義的stdin fileno stdout fineno stderr fileno 三個巨集來表示0,1,2.在程式中可以使用close來關閉stdout fineno 標準輸出 然後再使用open系統呼叫開啟裝置或者檔案,則其對應的檔案描述符則為1,此時系統就會將其作為標準...

linux下檔案描述符的介紹

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

linux下檔案描述符的介紹

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