确定生产者在管道中的速度是否超过消费者

确定生产者在管道中的速度是否超过消费者

如果我有:

node foo.js | node bar.js

有没有办法确定它们之间是否有队列正在建立?换句话说,生产者是否在 stdio 方面超过了消费者?

答案1

您可以ioctl(,FIONREAD,)在 Linux 中使用管道来获取当前可读取的字节数。这可能可以在man 7 pipeFIONREAD也在man tty_ioctl)中找到。您可以将其集成到您的应用程序中,或者使用管道作为标准输入并行运行类似 perl 的东西:

#!/usr/bin/perl
# https://unix.stackexchange.com/a/440361/119298
use strict;
require 'sys/ioctl.ph';
my $v = pack("l",0);
$| = 1;
# while(1)
{
  die "ioctl: $!" if ioctl(STDIN, &FIONREAD, $v)!=0;
  my @r = unpack("l",$v);
  printf "%d ",$r[0];
#  sleep 1;
}

所以用法是

node foo.js | (myperl & node bar.js)

尝试一下类似的东西

while sleep 1;do date;done |
while sleep 1.1;do myperl 2>/dev/null; dd status=none count=1 bs=20;done

perl我收到来自about 的警告_FORTIFY_SOURCE,因此发生了 stderr 重定向。读取dd的长度小于 的长度,date因此您可以看到结果逐渐增加。

为了完整起见,您可以使用up to获取管道的容量fcntl(,F_GETPIPE_SZ)并设置它(除非 root 或 has )。看。fcntl(,F_SETPIPE_SZ,newvalue)/proc/sys/fs/pipe-max-sizeCAP_SYS_RESOURCEman fcntl

相关内容