Как я могу перенаправить вывод из одного дескриптора файла в другой? - PullRequest
3 голосов
/ 06 марта 2009

Я хочу настроить конвейер процессов из Perl (работающий в Linux), состоящий из двух частей, запускаемых в разное время.

Например:

Запустить потребительский процесс:

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

затем намного позже запустите процесс производителя:

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

но затем каким-то образом перенаправить вывод из gpg во ввод tar.

Я могу сделать это, построив цикл:

while (<IN> ) {
  print OUT;
}

Но я хотел бы знать, могу ли я каким-то образом склеить два процесса вместе с перенаправлением.

Ответы [ 3 ]

11 голосов
/ 06 марта 2009

Добавить

pipe( IN, OUT );

Перед двумя открытыми заявлениями. Вот и все!

Если вы хотите сделать что-нибудь более сложное, я бы порекомендовал модуль IPC :: Run CPAN:

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

Позволяет запускать процессы, связывать их входы и выходы, а также добавлять протоколирование или перенаправление в любой точке цепочки.

1 голос
/ 06 марта 2009

Мне нравится 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";
1 голос
/ 06 марта 2009

Если два процесса совершенно не связаны, используйте FIFO.

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

Это создает FIFO в $ path. Теперь пусть один процесс записывает в этот файл, а другой - из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...