나는 부모, 어린이 및 파이프의 기능을 perl에서 배우려고합니다. 내 목표는 명령 행에서 읽고 파이프를 통해 인쇄하는 단일 파이프 (양방향이 아님)를 작성하는 것입니다. pid를 여러 번 참조하십시오.부모/자녀 및 포크 개론 소개 (Perl)
지금까지 코드 :
#!/usr/bin/perl -w
use warnings;
use strict;
pipe(READPIPE, WRITEPIPE);
WRITEPIPE->autoflush(1);
my $parent = $$;
my $childpid = fork() // die "Fork Failed $!\n";
# This is the parent
if ($childpid) {
&parent ($childpid);
waitpid ($childpid,0);
close READPIPE;
exit;
}
# This is the child
elsif (defined $childpid) {
&child ($parent);
close WRITEPIPE;
}
else {
}
sub parent {
print "The parent pid is: ",$parent, " and the message being received is:", $ARGV[0],"\n";
print WRITEPIPE "$ARGV[0]\n";
print "My parent pid is: $parent\n";
print "My child pid is: $childpid\n";
}
sub child {
print "The child pid is: ",$childpid, "\n";
my $line = <READPIPE>;
print "I got this line from the pipe: $line and the child pid is $childpid \n";
}
전류 출력은 다음과 같습니다
perl lab5.2.pl "I am brain dead"
The parent pid is: 6779 and the message being recieved is:I am brain dead
My parent pid is: 6779
My child pid is: 6780
The child pid is: 0
I got this line from the pipe: I am brain dead
and the child pid is 0
내가 자식 서브 루틴의 childpid 0으로 반환하는 이유를 알아 내기 위해 노력하고 있지만, 부모의 "정확한 찾고"pid #를 참조하고 있습니다. Is는 0을 반환해야합니까? (예를 들어 다중 서브 루틴을 만들면 0,1,2 등이 될 것입니다.)
고맙습니다.
'$ childpid'는'fork()'의 반환 값으로 설정 되었기 때문에 자식에서 0입니다. –
부모가'WRITEPIPE'에 쓰지만'READPIPE'를 닫는 것은 이상한 일입니다. 그리고 자식은' READPIPE'를 닫지 만'WRITEPIPE'를 닫습니다. – mob
@ HåkonHægland assitsance에 감사드립니다. 폭도가 이상하거나 괴상한 것처럼 보이는 이유는 무엇입니까? –