Dpkg

理解“dpkg –status-fd n”

  • April 30, 2015

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(標準輸入)so somefile(打開以供讀取)而不是之前的任何內容(終端,如果命令在終端中執行)。您可以在重定向運算符前添加描述符編號: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。然後前端從管道的讀取端讀取並在生成狀態消息時獲取它們,而不會有與其他任何東西混淆的風險。

引用自:https://unix.stackexchange.com/questions/199738