### 文件描述符
Linux很重要的設計思想就是一切皆文件,網絡是文件,鍵盤等外設也是文件,很神奇吧?于是所有資源都有了統一的接口,開發者可以像寫文件那樣通過網絡傳輸數據,我們也可以通過`/proc/`的文件看到進程的資源使用情況。
內核給每個訪問的文件分配了文件描述符(File Descriptor),它本質是一個非負整數,在打開或新建文件時返回,以后讀寫文件都要通過這個文件描述符了。
### 應用
我們想想操作系統打開的文件這么多,不可能他們共用一套文件描述符整數吧?這樣想就對了,Linux實現時這個fd其實是一個索引值,指向每個進程打開文件的記錄表。
POSIX已經定義了STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO三個常量,也就是0、1、2。這三個文件描述符是每個進程都有的,這也解釋了為什么每個進程都有編號為0、1、2的文件而不會與其他進程沖突。
文件描述符幫助應用找到這個文件,而文件的打開模式等上下文信息存儲在文件對象中,這個對象直接與文件描述符關聯。
### 限制
注意了,每個系統對文件描述符個數都有限制。我們網上看到配置`ulimit`也是為了調大系統的打開文件個數,因為一般服務器都要同時處理成千上萬個起請求,記住socket連接也是文件哦,使用系統默認值會出現莫名奇怪的問題。
講文件描述符其實是為高深莫測的epoll做鋪墊,掌握epoll對進程已經有很深的理解了。
- 前言
- 致謝
- 概述
- 使用代碼
- 使用Docker
- 進程基礎
- 進程是什么
- Hello World
- PID
- PPID
- 使用PID
- 進程名字
- 進程參數
- 輸入與輸出
- 并發與并行
- 進程越多越好
- 進程狀態
- 退出碼
- 進程資源
- 死鎖
- 活鎖
- POSIX
- Nohup
- 運行進程
- Go編程實例
- 衍生新進程
- 執行外部程序
- 復制進程
- 進程進階
- 文件鎖
- 孤兒進程
- 僵尸進程
- 守護進程
- 進程間通信
- 信號
- Linux系統調用
- 文件描述符
- Epoll
- 共享內存
- Copy On Write
- Cgroups
- Namespaces
- 項目實例Run
- 項目架構
- 代碼實現
- 注意事項
- 創建目錄權限
- 捕獲SIGKILL
- Sendfile系統調用
- 后記
- 參考書籍
- 項目學習
- 再次感謝