Pergunta

Eu quero configurar um gasoduto de processos de dentro Perl (rodando em Linux), que consiste em duas partes executar em momentos diferentes.

Por exemplo:

Iniciar o processo de consumo:

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

, em seguida, muito mais tarde iniciar o processo de produção:

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

mas depois de algum redirecionar a saída do gpg na entrada ao alcatrão.

Eu posso fazer isso através da construção de um loop:

while (<IN> ) {
  print OUT;
}

Mas eu gostaria de saber se eu posso de alguma forma colar os dois processos em conjunto com redirecionamento.

Foi útil?

Solução

Adicionar

pipe( IN, OUT );

Antes das duas declarações abertas. É isso aí!

Se você quiser fazer algo mais complicado, eu recomendaria o :: Run módulo CPAN IPC:

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

Ele permite que você iniciar processos, amarrar sua entrada e saídas juntos, e adicionar o registo ou o redirecionamento em qualquer ponto da cadeia.

Outras dicas

Se os dois processos são completamente alheios, usar um FIFO.

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

Isso cria um FIFO de US $ caminho. Agora tenho uma gravação processo para o arquivo, e o outro processo lê-lo.

Gosto Proc :: SafeExec ele permite que você unir processos e arquivo alças de formas quase arbitrárias facilmente. Aqui está um exemplo:

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();

Depois de olhar para IPC :: Run, parece muito mais simples ... aqui está o mesmo exemplo usando IPC :: Run em vez disso:

use IPC::Run qw(run);

run [qw(ls -l)], "|", [qw(sed -e s/a/b/)], ">", "tmp.txt";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top