理解“dpkg --status-fd n”

理解“dpkg --status-fd n”

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。然后,前端从管道的读取端读取并获取生成的状态消息,而不会冒与其他任何内容混淆的风险。

相关内容