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

Linux 文件系統核心機制:從文件描述符到系統調用與 C 庫函數

     編輯:關於C語言

在 Linux 世界裡,「一切皆文件」。本文系統梳理文件描述符概念、底層系統調用、高層 C 庫函數,並附上完整可執行範例代碼,幫你建立扎實的文件操作知識體系。

1. 文件描述符

定義:非負整數,索引進程打開文件表。進程啟動預設打開三個:

  • 0 – STDIN_FILENO (標準輸入)
  • 1 – STDOUT_FILENO (標準輸出)
  • 2 – STDERR_FILENO (標準錯誤)

統一接口讓記憶體、串口、終端、聲卡、進程等資源均可用同一組 API 操作。

2. 核心系統調用

2.1 創建 & 打開

#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。

2.2 讀寫

#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。

2.3 定位

off_t lseek(int fd, off_t offset, int whence);
  • SEEK_SET:檔案開頭
  • SEEK_CUR:目前位置
  • SEEK_END:檔案末尾

技巧:lseek(fd, 0, SEEK_END) 返回檔案長度。

2.4 關閉

int close(int fd);

務必檢查返回值:網路檔案系統可能延遲報錯;寫後緩衝導致實際寫入延遲,close 時才會回報錯誤,忽略將導致數據靜默丟失。

2.5 ioctl & fcntl (進階控制)

  • ioctl:裝置特定參數控制(如終端屬性、磁碟幾何)。
  • fcntl:文件鎖(記錄鎖/建議鎖/強制鎖)、複製描述符、非阻塞模式、信號驅動 I/O 等。
    範例展示 F_SETLK/F_GETLK 實現讀寫鎖互斥與共享語意。

2.6 select (I/O 多路復用)

單執行緒同時監控多個描述符就緒狀態,避免阻塞等待。屬經典模型,現代高併發常用 poll/epoll/kqueue。

3. C 標準庫函數

跨平台、帶緩衝、易用。核心函數:

  • 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") 讀回印出。

4. 庫函數 vs 系統調用

  • 系統調用:核心態,低級接口,直接進入核心(如 read/write)。
  • 庫函數:使用者態,高層封裝,多數最終呼叫系統調用(如 fread → read)。
  • 庫函數提供緩衝、格式化、跨平台一致性;系統調用提供精細控制、非阻塞、文件鎖等進階功能。

完整示範程式

文中包含兩個完整範例:

  1. 使用 open/read/write/lseek/close 實現檔案複製與驗證。
  2. 使用 fcntl 記錄鎖演示多進程互斥/共享存取。

代碼已處理錯誤碼、資源釋放,可直接編譯運行驗證。

掌握這套體系,你就能在 Linux 下自信地進行底層文件操作、排查 I/O 效能問題、實現進程間同步。

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