여기에는 시스템 프로그래밍이 포함되어 있으므로 기본적인 질문 이상의 것입니다. 서면에 따르면, 주 프로그램은 외부 프로그램과 전이중 상호 작용을 요구하지 않습니다. 데이터 흐름이 한 방향으로, 메인 프로그램
이 파이프 라인을 만들기 간단 → 외부 프로그램 → 즉
문자열로 이동합니다. Perl의 open
은 “Safe pipe opens” section of the perlipc documentation에 설명 된 유용한 모드를 가지고 있습니다.
프로세스 간 통신에 대한 또 다른 흥미로운 접근 방식은 단일 프로그램이 다중 프로세스로 이동하거나 또는 심지어 자신 사이에서 통신하는 것입니다. open
함수는 매우 흥미로운 일을하기 위해 "-|"
또는 "|-"
의 파일 인수를 허용합니다. 열린 파일 핸들에 연결된 자식을 분기합니다. 하위 프로그램은 상위 프로그램과 동일한 프로그램을 실행 중입니다. 이는 가정 된 UID 또는 GID로 실행될 때 파일을 안전하게 여는 데 유용합니다. 마이너스로 파이프를 여는 경우 열어 놓은 파일 핸들에 글을 쓸 수 있으며 아이는 STDIN
에서 찾을 수 있습니다. 마이너스에서 파이프를 여는 경우, 자녀가 작성한 파일 핸들을 STDOUT
에 열어 읽을 수 있습니다.
이것은 반환 값의 뉘앙스를주는 파이프가 관련된 open
입니다. perlfunc documentation on open
이 설명합니다. 명령 -
에 파이프를 열 경우
두 번, 그래서 개방 수익률을 암시 fork
완료, (즉, open
의 1 또는 2 인자 형태의 하나 |-
또는 -|
지정됩니다) 다음에 부모 프로세스는 자식 프로세스의 PID를 반환하고 자식 프로세스에서는 반환 된 (정의 된) 0
을 반환합니다. open
이 성공했는지 확인하려면 defined($pid)
또는 //
을 사용하십시오.
의 발판을 만들려면, 우리는 오른쪽에서 왼쪽 순서는 각 단계에서
open
fork
에 새로운 프로세스를 사용하여 작동합니다.
- 주 프로그램이 이미 실행 중입니다.
- 다음으로,
fork
결국 외부 프로그램이 될 프로세스입니다.출력은 우리 STDIN
에 도착 할 수 있도록 2 단계
- 먼저
fork
문자열 인쇄 공정에서 공정 내부
- .
- 그런 다음
exec
변환을 수행 할 외부 프로그램.
- 문자열 프린터가 작동하고 다음 수준으로 올라 오는
exit
을 수행 했습니까?
- 메인 프로그램으로 돌아 가면 변환 된 결과를 읽습니다.
이 모든 것을 설정 했으므로 하단에 제안을 삽입하면됩니다.
#! /usr/bin/env perl
use 5.10.0; # for defined-or and given/when
use strict;
use warnings;
my @transform = qw(tr [A-Za-z] [N-ZA-Mn-za-m]); # rot13
my @inception = (
"V xabj, Qnq. Lbh jrer qvfnccbvagrq gung V pbhyqa'g or lbh.",
"V jnf qvfnccbvagrq gung lbh gevrq.",
);
sub snow_fortress { print map "$_\n", @inception }
sub hotel {
given (open STDIN, "-|" // die "$0: fork: $!") { #/StackOverflow hiliter
snow_fortress when 0;
exec @transform or die "$0: exec: $!";
}
}
given (open my $fh, "-|" // die "$0: fork: $!") {
hotel when 0;
print while <$fh>;
close $fh or warn "$0: close: $!";
}
그런 재미있는 프로그램을 작성해 주셔서 감사합니다!
을 참조하십시오 '매뉴얼 페이지는 다른 접근 방식의 예에 대한 논의와 많이 가지고 perlipc'. – tripleee