我想在Perl(在Linux上运行)中建立一个流程管道,包括在不同时间运行的两个部分。
例如:
启动消费者流程:
open( OUT, "| tar xvf - " ) || die "Failed: tar: $!";
然后很久以后开始制作人流程:
open( IN, "gpg -d $file |" ) || die "Failed: gpg: $!";
然后以某种方式将gpg的输出重定向到tar的输入。
我可以通过构建循环来实现这一点:
while (<IN> ) {
print OUT;
}
但我想知道我是否能以某种方式将两个进程粘合在一起重定向。
答案 0 :(得分:11)
添加
pipe( IN, OUT );
在两个公开声明之前。就是这样!
如果你想做更复杂的事情,我会推荐IPC :: Run CPAN模块:
http://search.cpan.org/dist/IPC-Run/
它允许您启动进程,将输入和输出绑定在一起,并在链中的任何位置添加日志记录或重定向。
答案 1 :(得分:1)
如果两个进程完全不相关,请使用FIFO。
use POSIX qw(mkfifo);
mkfifo($path, 0700) or die "mkfifo $path failed: $!";
这会在$ path处创建一个FIFO。现在有一个进程写入该文件,另一个进程从中读取。
答案 2 :(得分:1)
我喜欢Proc::SafeExec它可以让您轻松地以几乎任意的方式将进程和文件句柄连接在一起。这是一个例子:
use strict;
use warnings;
use Proc::SafeExec;
open(my $ls, "-|", "ls", "-l") or die "Err: $!";
open(my $fh, ">", "tmp.txt") or die "Err: $!";
my $p = Proc::SafeExec->new({
exec => [qw(sed -e s/a/b/)],
stdin => $ls,
stdout => $fh,
});
$p->wait();
在查看IPC :: Run之后,它看起来简单得多......这是使用IPC :: Run的相同示例:
use IPC::Run qw(run);
run [qw(ls -l)], "|", [qw(sed -e s/a/b/)], ">", "tmp.txt";