私が持っているなら:
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
_FORTIFY_SOURCE
stderrリダイレクトが発生するという警告メッセージが表示されます。読み取った長さdd
がの長さより小さいdate
ので、結果が徐々に増加することがわかります。
完全性のために、upを使用してパイプの容量を取得してfcntl(,F_GETPIPE_SZ)
設定できます(ルートまたはhasでない場合)。望むより。fcntl(,F_SETPIPE_SZ,newvalue)
/proc/sys/fs/pipe-max-size
CAP_SYS_RESOURCE
man fcntl