한 파일 핸들에서 출력을 다른 파일 핸들로 리디렉션하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/618953

  •  03-07-2019
  •  | 
  •  

문제

별도의 시간에 실행되는 두 부분으로 구성된 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 :: 실행 CPAN 모듈을 권장합니다.

http://search.cpan.org/dist/ipc-run/

프로세스를 시작하고 입력 및 출력을 함께 묶고 체인의 어느 시점에서나 로깅 또는 리디렉션을 추가 할 수 있습니다.

다른 팁

두 프로세스가 완전히 관련이없는 경우 FIFO를 사용하십시오.

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

이것은 $ 경로에서 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 :: 대신 런을 사용하는 것과 동일한 예가 있습니다.

use IPC::Run qw(run);

run [qw(ls -l)], "|", [qw(sed -e s/a/b/)], ">", "tmp.txt";
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top