我可以创建一个管道来在两个程序之间传输信息。我什至可以使用像pv这样的实用程序来查看通过管道的总数据的进度。就我而言,我使用的是命名管道。当数据写入管道时,它会一直留在那里,直到其他程序将其读出。
是否可以打印管道中的当前字节数而不实际读取它们?
更新:
发现这些文章很有用:
请注意,当您执行以下操作时:
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)