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
.