家长/儿童和福克斯调查简介(Perl)

时间:2017-03-05 22:46:58

标签: perl fork parent-child

我试图在perl中学习父母,孩子和管道的功能。我的目标是创建一个从命令行读取的单个管道(非双向),并通过管道打印它。多次引用pids。

到目前为止的代码:

#!/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,但是在父级中它正在引用&#34;准确的查找&#34; pid#。 是应该返回0? (例如,如果我制作了多个子程序,它们会是0,1,2等等吗?)

先谢谢。

1 个答案:

答案 0 :(得分:2)

是的,it should be 0,并且在fork来电的每个子流程中都为0。

  

<强>叉

     

fork(2)系统是否调用以创建运行该进程的新进程                  相同的程序在同一点。它返回子pid                  父进程,0到子进程,或&#34; undef&#34;如果                  fork不成功。

在fork之后,在子进程中将$$更改为新进程ID。因此,孩子可以阅读$$来获取子进程ID(它自己的id)。