1. 程式人生 > >Linux 檔案控制代碼的這些技術內幕,只有 1% 的人知道

Linux 檔案控制代碼的這些技術內幕,只有 1% 的人知道

image

1. 緣起

某個月朗風清的晚上,正在公司對面的深大操場跑步,突然接到同事發來的訊息,他發現某機器上的檔案控制代碼使用量有十一萬多個(下面輸出中的第一個欄位)

image


但是通過運維常用的lsof命令算了下,相差甚遠。

image


似乎很不科學,這裡看到的資料不到1萬個,剩下10多萬的檔案控制代碼哪裡去了呢(系統完整性檢查已排除黑客入侵可能性)

2. 檔案描述符和檔案控制代碼的故事

先看一張著名的圖吧

image


這裡我們先區分好兩個概念:檔案描述符和檔案控制代碼

簡單來說,每個程序都有一個開啟的檔案表(fdtable)。表中的每一項是struct file型別,包含了開啟檔案的一些屬性比如偏移量,讀寫訪問模式等,這是真正意義上的檔案控制代碼。

檔案描述符是一個整數。代表fdtable中的索引位置(下標),指向具體的struct file(檔案控制代碼)。

3. file-nr 檔案裡的值是檔案描述符還是檔案控制代碼?

順著核心程式碼找一下:

image

可以看出file-nr指標是由proc_nr_files函式處理,該函式最終其實是讀取了nr_files全域性變數

原文連結