我正在尝试从 Perl 设置任意管道,其方式与 shell 可能相同。
这具有预期的效果,就像“echo foo | sed s/oo/ar/”:
#!/usr/bin/perl
use strict;
use IO::Handle;
$| = 1;
my ($first_prog, $second_prog) = ([qw(echo foo)], [qw(sed s/oo/ar/)]);
#$second_prog = ["less"];
pipe(my $second_prog_input, my $first_prog_output)
or die "problem setting up pipe: $!\n";
if (fork) {
STDOUT->fdopen(fileno($first_prog_output), 'w') or die;
exec(@$first_prog) or die;
}
else {
STDIN->fdopen(fileno($second_prog_input), 'r') or die;
exec(@$second_prog) or
die "couldn't exec: $!: command was @$first_prog\n";
}
但是,当我将第二个参数设为“less”时,我的终端会闪烁,并且在寻呼机中看不到输出。除了短暂的闪光之外,根本没有减少跑步的迹象。
现在我根本没有得到的是以下行为确实像“echo foo | less”:
pipe(my $first_prog_output, STDIN) or die "problem setting up pipe: $!\n";
my ($first_prog, $second_prog) = ([qw(echo foo)], ["less"]);
open($first_prog_output, "-|", @$first_prog) or
die "$!: command was @$first_prog\n";
exec(@$second_prog) or
die "couldn't exec: $!: command was @$first_prog\n";
但我根本不明白对 pipe() 的调用在做什么。第一个参数应该是“读者”,第二个参数应该是“作者”。STDIN 如何成为“作家”?
我对这一切感到非常困惑,并认为我可能遗漏或忘记了底层 Unix API 的一些基本内容。