首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux 系統程式設計筆記(二):檔案 I/O 核心 API 完整速查表

     編輯:關於C語言

Linux 檔案描述符與無緩衝 I/O 核心介面詳解

Linux 核心將所有輸入輸出裝置(檔案、管道、Socket、終端機、裝置檔)統一抽象為檔案描述符(File Descriptor, FD)——非負整數。每個進程擁有獨立 FD 表,預設開啟三個標準描述符:

名稱巨集數值用途
標準輸入STDIN_FILENO0鍵盤/重導向輸入
標準輸出STDOUT_FILENO1螢幕/管道輸出
標準錯誤STDERR_FILENO2錯誤訊息輸出

核心系統呼叫速查

函式原型說明回傳值
openint open(const char *path, int flags, mode_t mode);開啟/建立檔案,flags 組合:O_RDONLY\|O_WRONLY\|O_RDWR、O_CREAT、O_TRUNC、O_APPEND、O_NONBLOCK 等成功≥0 (FD),失敗 -1
readssize_t read(int fd, void *buf, size_t count);讀取最多 count 位元組至 buf>0 實際讀取量,0=EOF,-1 錯誤
writessize_t write(int fd, const void *buf, size_t count);將 buf 前 count 位元組寫入 fd>0 實際寫入量,-1 錯誤
closeint close(int fd);關閉檔案描述符0 成功,-1 失敗
lseekoff_t lseek(int fd, off_t offset, int whence);移動檔案偏移量,whence:SEEK_SET/SEEK_CUR/SEEK_END新偏移量,-1 錯誤
ioctlint ioctl(int fd, int request, ...);裝置控制通用介面(終端機、磁碟、網卡等)視 request 而定,-1 錯誤
fcntlint fcntl(int fd, int cmd, ...);檔案描述符屬性控制(F_GETFL/F_SETFL、鎖定 F_SETLK、F_SETOWN 等)視 cmd 而定,-1 錯誤
dupint dup(int oldfd);複製 FD,回傳最小未用 FD新 FD,-1 失敗
dup2int dup2(int oldfd, int newfd);指定新 FD 編號,若佔用先關閉newfd,-1 失敗
mkstempint mkstemp(char *template);建立唯一暫存檔,template 結尾需 6 個 X,原子操作FD,-1 失敗

實務關鍵點

  1. 部分讀寫是常態:read/write 可能傳輸少於請求位元組(訊號中斷、非阻塞、管道滿/空),必須用迴圈處理殘餘。
    ssize_t writen(int fd, const void *buf, size_t n) {
        size_t left = n;
        const char *p = buf;
        while (left > 0) {
            ssize_t written = write(fd, p, left);
            if (written <= 0) {
                if (errno == EINTR) continue; // 被信號中斷,重試
                return -1;
            }
            left -= written;
            p += written;
        }
        return n;
    }
    
  2. O_APPEND 原子附加:多進程同時寫入同一檔案不會覆蓋彼此資料。
  3. lseek 不會引發 I/O,僅修改核心檔案表項的偏移量指標。
  4. dup2 是 Shell 實現重導向(cmd > file)的核心:dup2(fd, STDOUT_FILENO)。
  5. mkstemp 回傳已開啟 FD,避免 tmpnam/mktemp 的競爭條件 (TOCTOU)。

錯誤處理模式

int fd = open("data.bin", O_RDONLY);
if (fd < 0) {
    perror("open data.bin"); // 輸出 "open data.bin: No such file or directory"
    exit(EXIT_FAILURE);
}

所有系統呼叫失敗均設定全域 errno,配合 strerror(errno) 或 perror 診斷。

進階主題預告

  • 檔案鎖定:fcntl 記錄鎖 (F_SETLK/F_SETLKW) 與 flock
  • 非阻塞 I/O 與 poll/epoll 多工
  • 記憶體映射 mmap:零拷貝、檔案即記憶體
  • 散聚/聚集 I/O:readv/writev

無緩衝 I/O 雖較標準 C 庫(fopen/fread)繁瑣,但提供精確控制、零拷貝潛力、非阻塞多工能力,是高效能伺服器、資料庫引擎、嵌入式系統的必修內功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved