打印管道中的当前字节数

dtm*_*and 6 pipe fifo

我可以创建一个管道来在两个程序之间传输信息。我什至可以使用像pv这样的实用程序来查看通过管道的总数据的进度。就我而言,我使用的是命名管道。当数据写入管道时,它会一直留在那里,直到其他程序将其读出。

是否可以打印管道中的当前字节数而不实际读取它们?


更新:

发现这些文章很有用:

/sf/answers/2406110381/

/sf/answers/488598281/

Sté*_*las 7

请注意,当您执行以下操作时:

cmd > named-pipe
Run Code Online (Sandbox Code Playgroud)

虽然没有其他进程可以打开管道进行读取,但open()挂起的是 。那open()上面是由shell完成的,cmd甚至没有开始,所以不会有任何数据发送给它。

在许多系统上,如 Solaris、AIX 或 HP/UX,但不是 Linux,如果实例化,管道中的字节数将显示在ls -l管道上的大小字段中。

在某些系统上(包括 Linux,请参阅此处的pipe(7)),您可以使用FIONREAD ioctl(). 但是,这必须在管道上的文件描述符上运行(到任一端),这意味着对于命名管道,您必须打开它,这意味着您可能最终将管道实例化为副作用(并杀死它在关闭时)。

perl -le 'require "sys/ioctl.ph";
          ioctl(STDIN, &FIONREAD, $n) or die$!;
          print unpack "L", $n' <> named-pipe
Run Code Online (Sandbox Code Playgroud)