理解“dpkg –status-fd n”
從
man dpkg
(基於 Debian (7) 的 Linux 發行版上的 1.16.16 (i386)):
--status-fd n
將機器可讀的包狀態和進度資訊發送到文件描述符n
我將其讀為:“轉發機器可讀程式碼,例如通過
printf
文件描述符生成”。我(想)知道文件描述符stdin
(0)、stdout
(1)和stderr
(2)。試圖查找一些範例,我發現除了錯誤報告之外什麼都沒有,文件描述符部分由兩位數字組成(可能更多……)。這擴展了我對文件描述符的了解,從而引發了更多問題。因此:
問題:如何使用
dpkg
選項--status-fd
?一個實際的例子和一些關於發生的事情的註釋將有助於我理解
該選項
--status-fd
告訴dpkg
以其他程序可以解析的方式報告進度,例如在 GUI 中向使用者呈現漂亮的進度報告。to 的參數
--status-fd
是文件描述符,即指定打開文件的數字。稍微簡化一下:
- 當一個程序第一次打開一個文件時,該文件被分配描述符編號 0。下一次,該文件被分配描述符編號 1,依此類推。系統
open
呼叫返回文件描述符。- 當程序要對文件執行操作時,例如從文件中讀取或寫入時,它會通過文件的描述符來指定文件,例如
read(0, addr, 10)
“從描述符0 讀取10 個字節,並將它們放在記憶體地址addr
”。- 每個程序都有自己的文件描述符:程序p中的文件描述符n與程序q中的文件描述符**n無關。
- 程序在創建時繼承其父級的文件描述符。
- 按照慣例,程序在文件描述符 0、1 和 2 已打開的情況下執行。0 用於輸入,1 用於正常輸出,2 用於錯誤消息。
重定向打開特定描述符上的文件。例如,在 shell 腳本或命令行中,
mycommand <somefile
連接文件描述符編號 0(標準輸入)sosomefile
(打開以供讀取)而不是之前的任何內容(終端,如果命令在終端中執行)。您可以在重定向運算符前添加描述符編號:mycommand 3<somefile
將文件描述符編號 3 連接到somefile
(大多數命令不會對該文件描述符執行任何操作)。當 dpkg 安裝、升級或刪除軟體包時,它會在軟體包的預/後安裝/刪除腳本中執行各種其他命令。其中一些命令可能讀取輸入或顯示消息,因此 dpkg 保持標準描述符連接到它們在呼叫時連接到的任何內容。
由於已採用標准文件描述符,因此
dpkg
允許呼叫者為狀態報告指定不同的描述符。您可以將狀態報告放在一個文件中,例如:dpkg --status-fd 3 -i somefile.deb 3>/tmp/dpkg.status
在另一個終端中,執行
tail -n +1 -f /tmp/dpkg.status
並觀察即將出現的狀態消息。
dpkg
通常呼叫和想要狀態報告的前端會在執行之前打開一個管道dpkg
(單向通信通道) ,並將文件描述符作為參數傳遞給管道的寫入端--status-fd
。然後前端從管道的讀取端讀取並在生成狀態消息時獲取它們,而不會有與其他任何東西混淆的風險。