[TOC]
首先,Linux的世界里一切皆為文件,無論是設備還是一個socket連接。文件又可分為:普通文件、目錄文件、鏈接文件和設備文件。文件描述符(file descriptor)是內核為了高效管理已被打開的文件所創建的索引,其是一個非負整數(通常是小整數),用于指代被打開的文件,所有執行I/O操作的系統調用都通過文件描述符。程序剛剛啟動的時候,0是標準輸入,1是標準輸出,2是標準錯誤。如果此時去打開一個新的文件,它的文件描述符會是3。POSIX標準要求每次打開文件時(含socket)必須使用當前進程中最小可用的文件描述符號碼,因此,在網絡通信過程中稍不注意就有可能造成串話。標準文件描述符圖如下:
> 1. 文件描述符是一個大于零的整數,對應一個打開的文件
> 2. 不同的文件描述符可能對應同一個文件
> 3. 相同的文件可以被不同的進程打開也可以在同一個進程中被多次打開
> 4. 系統為每一個進程維護了一個文件描述符表,該表的值都是從0開始的,所以在不同的進程中你會看到相同的文件描述符,這種情況下相同文件描述符有可能指向同一個文件,也有可能指向不同的文件。
> 5. 兩個不同的文件描述符,若指向同一個打開文件句柄,將共享同一文件偏移量。因此,如果通過其中一個文件描述符來修改文件偏移量(由調用read()、write()或lseek()所致),那么從另一個描述符中也會觀察到變化,無論這兩個文件描述符是否屬于不同進程,還是同一個進程,情況都是如此。
## 1. 描述符表
有三種表:
### 1.1進程級的文件描述符表
進程級的描述符表的每一條目記錄了單個文件描述符的相關信息。
> 1. 控制文件描述符操作的一組標志。(目前,此類標志僅定義了一個,即close-on-exec標志)
> 2. 對打開文件句柄的引用
### 1.2 系統級的打開文件描述符表
內核對所有打開的文件的文件維護有一個系統級的描述符表格(open file description table)。有時,也稱之為打開文件表(open file table),并將表格中各條目稱為打開文件句柄(open file handle)。一個打開文件句柄存儲了與一個打開文件相關的全部信息,如下所示:
> 1. 當前文件偏移量(調用read()和write()時更新,或使用lseek()直接修改)
> 2. 打開文件時所使用的狀態標識(即,open()的flags參數)
> 3. 文件訪問模式(如調用open()時所設置的只讀模式、只寫模式或讀寫模式)
> 4. 與信號驅動相關的設置
> 5. 對該文件i-node對象的引用
> 6. 文件類型(例如:常規文件、套接字或FIFO)和訪問權限
> 7. 一個指針,指向該文件所持有的鎖列表
> 8. 文件的各種屬性,包括文件大小以及與不同類型操作相關的時間戳
5. 文件系統的i-node表
- Linux
- 高級
- 殺毒
- 記一次中毒事件
- clamav查毒軟件
- 處理挖礦病毒
- 定時任務
- kill
- chattr文件保護
- 運行級別
- Linux啟動
- 文件加密
- ssh免密登錄
- .ssh
- 問題
- 腳本
- 阿里云域名解析
- yum源
- 時間同步
- keepalived實現高可用
- dos字符與unix字符
- 大文件上傳
- 基礎
- proc目錄
- 設置宋體
- 基礎命令_01
- 基礎命令_02
- SELinux
- 文件描述符
- 基礎命令_03
- awk
- 系統日志
- date命令
- bc命令
- lsof
- vim快捷鍵
- shell
- 循環控制
- expr
- 執行腳本的方式
- declare
- shell腳本
- 控制啟停腳本
- 數值計算
- centos
- 配置網絡
- 環境
- 灰度環境
- ansible
- 模塊
- 語法
- file模塊
- setup模塊
- ping模塊
- copy模塊
- command模塊
- shell模塊
- service模塊
- cron模塊
- yum模塊
- user 模塊
- group模塊
- 指定用戶
- playbook
- 實例
- ansible安裝
- Jenkins
- shell部署
- 導入已有項目的配置
- 執行shell
- tungsten數據同步
- 防火墻
- netfilter