在 Linux 世界裡,「一切皆文件」。本文系統梳理文件描述符概念、底層系統調用、高層 C 庫函數,並附上完整可執行範例代碼,幫你建立扎實的文件操作知識體系。
定義:非負整數,索引進程打開文件表。進程啟動預設打開三個:
STDIN_FILENO (標準輸入)STDOUT_FILENO (標準輸出)STDERR_FILENO (標準錯誤)統一接口讓記憶體、串口、終端、聲卡、進程等資源均可用同一組 API 操作。
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int creat(const char *pathname, mode_t mode); int open(const char *pathname, int flags, mode_t mode);
flags:O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_TRUNC, O_APPEND, O_NONBLOCK, O_SYNC 等組合。mode:配合 O_CREAT 指定權限,如 S_IRUSR | S_IWUSR (0600) 或八進制 0666。#include <unistd.h> ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count);
返回實際讀寫位元組數;0 表示 EOF,-1 表示錯誤並設 errno。
off_t lseek(int fd, off_t offset, int whence);
SEEK_SET:檔案開頭SEEK_CUR:目前位置SEEK_END:檔案末尾技巧:lseek(fd, 0, SEEK_END) 返回檔案長度。
int close(int fd);
務必檢查返回值:網路檔案系統可能延遲報錯;寫後緩衝導致實際寫入延遲,close 時才會回報錯誤,忽略將導致數據靜默丟失。
ioctl:裝置特定參數控制(如終端屬性、磁碟幾何)。fcntl:文件鎖(記錄鎖/建議鎖/強制鎖)、複製描述符、非阻塞模式、信號驅動 I/O 等。F_SETLK/F_GETLK 實現讀寫鎖互斥與共享語意。單執行緒同時監控多個描述符就緒狀態,避免阻塞等待。屬經典模型,現代高併發常用 poll/epoll/kqueue。
跨平台、帶緩衝、易用。核心函數:
fopen/fclose:模式 r/w/a/r+/w+/a+,b 僅 Windows 有效。fprintf/fscanf;字串:fgets/fputs;二進位:fread/fwrite。fseek/ftell/rewind,fgetpos/fsetpos。範例:以 fopen("hello.txt","w+") 寫入 "Hello World!",再 fopen("hello.txt","r") 讀回印出。
read/write)。fread → read)。文中包含兩個完整範例:
open/read/write/lseek/close 實現檔案複製與驗證。fcntl 記錄鎖演示多進程互斥/共享存取。代碼已處理錯誤碼、資源釋放,可直接編譯運行驗證。
掌握這套體系,你就能在 Linux 下自信地進行底層文件操作、排查 I/O 效能問題、實現進程間同步。