我想在Perl(在Linux上运行)中建立一个流程管道,包括在不同时间运行的两个部分。

例如:

启动消费者流程:

open( OUT, "| tar xvf - " ) || die "Failed: tar: $!";

然后很久以后开始制作人流程:

open( IN, "gpg -d $file |" ) || die "Failed: gpg: $!";

然后以某种方式将gpg的输出重定向到tar的输入。

我可以通过构建循环来实现这一点:

while (<IN> ) {
  print OUT;
}

但我想知道我是否能以某种方式将两个进程粘合在一起重定向。

有帮助吗?

解决方案

添加

pipe( IN, OUT );

在两个公开声明之前。就是这样!

如果你想做更复杂的事情,我会推荐IPC :: Run CPAN模块:

http://search.cpan.org/dist/IPC-Run/

它允许您启动进程,将输入和输出绑定在一起,并在链中的任何位置添加日志记录或重定向。

其他提示

如果两个进程完全不相关,请使用FIFO。

use POSIX qw(mkfifo);
mkfifo($path, 0700) or die "mkfifo $path failed: $!";

这会在$ path处创建一个FIFO。现在有一个进程写入该文件,另一个进程从中读取。

我喜欢 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";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top