(아마이 후 표준 입력을 닫아야합니다) 또한 내가 할 :Perl open2()와 함께 SIGCHLD, 교착 상태가 발생 했습니까? 나는 그것의 표준 입력을 통해 각 프로세스의 "매개 변수"를 전달 <code>IPC::Open2::open2()</code>와 여러 자식 프로세스를 열 FreeBSD의에 펄 스크립트에서
sub handle_SIGCHLD {
for(;;) {
my $kid = waitpid(-1, WNOHANG);
break if $kid == 0;
my $KidOutputFD = ...; # I stored the kid's output pipe FD earlier in the program
my $KidOutput = read_file($KidOutputFD); # use File::Slurp
# process $KidOutput
}
}}
$SIG{'CHLD'} = \&handle_SIGCHLD;
지금 질문 : 이와 같은 코드에서 뭔가 교착 상태가 발생할 수 있습니까? 나는 아이가 도착했을 때가 아니라 아이의 결과물을 읽는 것을 더 선호한다. 문제가 발생할 수 있습니까?
또한 "stdin"을 통해 어린이에게 전달되는 매개 변수는 긴 문자열 일 수 있습니다. 전체 문자열을 하나의 print
연산자를 통해 자식 stdin의 FD와 함께 전달할 것입니다. 스크립트에 매개 변수를 작성하는 도중에 차단할 수 있습니까?
교착 상태가 발생하지 않도록하려면 어떻게해야합니까? 아마도 SIGPIPE를 처리해야합니까? (나는 그것을하고 싶지 않다. 입력 문자열을 자식 프로세스에 의해 출력 문자열로 간단하게 변환하기에는 너무 많은 작업이 필요하다. 더 간단한 방법이 있는가?)
또한 여러 자식 프로세스에 걸쳐있다. 때로는 프로세스가 종료 될 때까지 기다리는 경우가 있습니다. 때로는 SIGTERM을 사용하여 하위 프로세스를 종료합니다.
더 구체적인 질문 : (양면에서 열리고 폐쇄하지 않을) (상대방이 그것을 읽을 수없는 경우) 블록을 파이프에 기록 할 수 있습니까?
'waitpid'는 -1을 반환 할 수 있으므로이 코드를 무한 루프에 넣을 수 있습니다. – mob