如果我有:
node foo.js | node bar.js
有没有办法确定它们之间是否有队列正在建立?换句话说,生产者是否在 stdio 方面超过了消费者?
答案1
您可以ioctl(,FIONREAD,)
在 Linux 中使用管道来获取当前可读取的字节数。这可能可以在man 7 pipe
(FIONREAD
也在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-size
CAP_SYS_RESOURCE
man fcntl