Você pode usar ioctl(,FIONREAD,) em pipes no Linux para obter o número atual de bytes disponíveis para leitura. Isso pode ser encontrado em man 7 pipe ( FIONREAD também está em man tty_ioctl ). Você pode integrar isso em seu aplicativo ou executar algo parecido com esse bit de perl em paralelo com ele, usando o pipe como stdin:
#!/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;
}
Assim, o uso seria
node foo.js | (myperl & node bar.js)
Experimente com algo como
while sleep 1;do date;done |
while sleep 1.1;do myperl 2>/dev/null; dd status=none count=1 bs=20;done
Recebo avisos de perl sobre _FORTIFY_SOURCE , daí o redirecionamento stderr. O dd lê menos que o comprimento de date para que você possa ver o resultado aumentando gradualmente.
Para completar, você pode obter a capacidade de um canal com fcntl(,F_GETPIPE_SZ) e defini-lo com fcntl(,F_SETPIPE_SZ,newvalue) até /proc/sys/fs/pipe-max-size (a menos que tenha raiz ou tenha CAP_SYS_RESOURCE ). Veja man fcntl .