2017-03-05 9 views
1

나는 부모, 어린이 및 파이프의 기능을 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 등이 될 것입니다.)

고맙습니다.

+0

'$ childpid'는'fork()'의 반환 값으로 설정 되었기 때문에 자식에서 0입니다. –

+0

부모가'WRITEPIPE'에 쓰지만'READPIPE'를 닫는 것은 이상한 일입니다. 그리고 자식은' READPIPE'를 닫지 만'WRITEPIPE'를 닫습니다. – mob

+0

@ HåkonHægland assitsance에 감사드립니다. 폭도가 이상하거나 괴상한 것처럼 보이는 이유는 무엇입니까? –

답변

2

예, it should be 0이며 fork 호출에서 오는 모든 하위 프로세스에서 0이됩니다.

포크

포크 (2) 시스템 호출 같은 지점에서 같은 프로그램을 실행하는 새로운 프로세스를 만들 수 없습니다. 자식 프로세스에 자식 pid를 , 자식 프로세스에 0을 반환하고 포크가 실패하면 "undef"를 반환합니다.

포크 후 $$은 하위 프로세스에서 새 프로세스 ID로 변경됩니다. 그래서 자식 프로세스 ID (자신의 id)를 얻기 위해 $$을 읽을 수 있습니다.

+0

정확하지 않습니다. '$$'의 값은 검사 할 때 바뀌며'fork '가 아닌 경우 바뀝니다. '$$'는'getpid()'에 대한 래퍼입니다. – ikegami