3

我想从 Perl(在 Linux 上运行)中建立一个进程管道,由两个部分组成,在不同的时间运行。

例如:

启动消费者进程:

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

然后很久以后开始生产者进程:

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

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

我可以通过构建一个循环来做到这一点:

while (<IN> ) {
  print OUT;
}

但我想知道我是否可以通过重定向将这两个过程粘合在一起。

4

3 回答 3

11

添加

pipe( IN, OUT );

在两个打开的语句之前。就是这样!

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

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

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

于 2009-03-06T14:15:41.443 回答
1

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

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

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

于 2009-03-06T14:17:38.367 回答
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";
于 2009-03-06T16:54:29.610 回答