在 Linux/Unix 系統中,文件描述符 是一個非負整數,用於標識進程打開的文件、Socket、管道等 I/O 資源。每個進程預設擁有三個標準描述符:
0 – 標準輸入1 – 標準輸出2 – 標準錯誤後續打開的文件依次分配 3、4、5… 系統會限制每個進程可同時打開的描述符數量(可透過 ulimit -n 查看/調整)。
文件描述符本身只是一個索引,指向進程內核中的 文件描述符表。每個表項包含:
FD_CLOEXEC)因此,描述符不直接包含文件地址或狀態,而是透過內核數據結構間接關聯。
Windows 的 句柄 同樣是不透明的整數值,用於標識內核對象(文件、線程、互斥體等)。兩者概念相似,但實現細節不同:
| 特性 | Linux 文件描述符 | Windows 句柄 |
|---|---|---|
| 類型 | 非負整數 | 指針大小的無符號整數 |
| 範圍 | 0 起始,進程私有 | 系統全域唯一,進程間可繼承/複製 |
| 底層結構 | 文件描述符表 → 打開文件表 → v-node | 對象管理器 → 內核對象 |
| 關閉方式 | close(fd) | CloseHandle(h) |
open() / creat() – 獲取新描述符read() / write() – 數據傳輸fcntl() – 修改描述符屬性(如設定非阻塞、FD_CLOEXEC)dup() / dup2() – 複製描述符close() – 釋放描述符更深入的內核視角可參考:Linux 文件描述符原理分析