从man dpkg
(1.16.16 (i386) 在基于 Debian (7) 的 Linux 发行版上):
--status-fd n
向文件描述符发送机器可读的包状态和进度信息n
我把这个读作:“转发机器可读代码,例如生成printf
到文件描述符”。我(认为)知道文件描述符stdin
(0)、stdout
(1) 和stderr
(2)。
尝试查找一些示例,我发现除了错误报告之外什么也没有,文件描述符部分由两位数字组成(可能更多......)。这扩展了我对文件描述符的了解,这会引发更多问题。因此:
问题dpkg
:选项如何--status-fd
使用?
一个实际的例子和一些发生的事情的注释将有助于我理解
答案1
该选项--status-fd
告诉dpkg
以其他程序可以解析的方式报告进度,例如在 GUI 中向用户呈现良好的进度报告。
的参数--status-fd
是文件描述符,即指定打开文件的数字。稍微简化一下:
- 当进程第一次打开文件时,该文件将被分配描述符编号 0。下一次,该文件将被分配描述符编号 1,依此类推。系统
open
调用返回文件描述符。 - 当进程想要对文件执行操作时,例如从中读取或写入,它通过文件描述符来指定该文件,例如,
read(0, addr, 10)
意味着“从描述符0读取10个字节并将它们放在内存地址addr
”。 - 每个进程都有自己的文件描述符:文件描述符n进行中p与文件描述符无关n进行中q。
- 进程在创建时继承其父进程的文件描述符。
- 按照惯例,进程在文件描述符 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
。然后,前端从管道的读取端读取并获取生成的状态消息,而不会冒与其他任何内容混淆的风险。