2009-03-06 2 views
3

Perl (Linux에서 실행) 내에서 프로세스의 파이프 라인을 설정하려고합니다. 두 부분은 별도의 시간에 실행됩니다.한 파일 핸들의 출력을 다른 파일 핸들로 리디렉션 할 수 있습니까?

예 :

는 소비자 프로세스를 시작

:

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

후 훨씬 나중에 생산 프로세스를 시작합니다

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

을하지만 어떻게 든 타르의 입력에 GPG의 출력을 리디렉션 .

while (<IN>) { 
    print OUT; 
} 

을하지만 어떻게 든 재와 함께 두 개의 프로세스를 접착제 수 있는지 알고 싶습니다 :

나는 루프를 구축 할 수 있습니다.

+0

사용하는 이유 '또는'하지 '||'대신에? '또는'은 다른 연산자보다 우선 순위가 낮으므로 함수의 괄호를 사용하지 않으면 '또는'가 동일하게 작동하지만 '||' 함수의 인수를 재정의하기 시작합니다. 이는 거의 원하는 것입니다. 게다가, 그것은 (나에게) 더 멋져 보인다. –

답변

11

두 개의 열린 문 전에

pipe(IN, OUT); 

를 추가합니다. 그게 다야!

당신이 더 복잡 아무것도 할 원한다면, 나는 IPC :: 실행 CPAN 모듈 추천 :

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

그것은 수 있습니다 당신이 프로세스를 시작을 자신의 입력을 묶어 함께 출력 및 로깅을 추가하거나 체인의 어느 지점에서 리다이렉션.

+0

작은 테스트 스크립트에서 유용합니다. 감사. #!/usr/bin/perl -w 파이프 (IN, OUT) || 죽어 "실패 : pipe : $!"; open (OUT, "| cat -n") || 죽는다 "실패 : cat : $! \ n"; open (IN, "netstat -n |") || 죽어 "실패 : netstat : $!"; 닫기 (IN); 닫기 (OUT); – Martin

+0

나는 forked 프로세스를 위해 부모/자식 통신을하기 전에 pipe를 사용했다. 그리고 그것은 나를 위해 일하는 것 같지 않습니다 (solaris의 perl 5.8). open() 함수는 IN/OUT 핸들 사이에서 파이프를 닫거나 연결을 끊는 것 같습니다. – runrig

1

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

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

이렇게하면 $ path에 FIFO가 만들어집니다. 이제 하나의 프로세스가 해당 파일에 쓰고 다른 프로세스는 그 프로세스에서 읽습니다.

1

나는 Proc::SafeExec을 좋아하는데, 프로세스와 파일 핸들을 거의 임의의 방법으로 쉽게 연결할 수 있습니다. 다음은 예입니다 : 여기 ..., 그것은 훨씬 간단하게 보이는 IPC :: 실행보고 후

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를 사용하여 동일한 예제 : 대신 실행

use IPC::Run qw(run); 

run [qw(ls -l)], "|", [qw(sed -e s/a/b/)], ">", "tmp.txt"; 
+0

이 모듈은 흥미로워 보입니다.나는 다음 주를 조사 할 것이다. 감사. – Martin

+0

예, IPC :: Run을 발견 할 때까지 입력/출력 리디렉션, 포크/exec, 신호 처리 및 PID 모니터링과 같은 작업을 너무 오랫동안 보냈습니다. (그리고 다소 적게는 Proc :: Simple) – rjh