1  #!/bin/perl
     2  $return=fork;
     3  if ($return == 0){
     4  print "this is the child process;return value is $return.\n";
     5  exec "/bin/date"or die"exec failed:$!\n";
     6  print "this line will never be outputted!\n";
     7  }
     8  elsif (defined $return){
     9  $waitting=wait;
    10  print "parent process:return pid is $return.\n";
    11  $waitting=wait;
    12  print "back in parent process.\n";
    13  print "the dead child's pid is $return.\n";
    14  }
    15  else {
    16  die "fork error:$!\n";
    17  }
    18  print "hello only once.\n";

脚本执行结果:

[root@stationx perl]# perl fork.pl
this is the child process;return value is 0.
Fri May  4 00:21:13 CST 2012
parent process:return pid is 4560.
back in parent process.
the dead child's pid is 4560.
hello only once.

在fork出的子程序中执行了一个exec(利用新代码替换当前进行的代码进行执行操作,执行完后退出,并不返回到该程序中)操作,由于exec执行完之后并不会在回到fork出的那个子程序中去,此时fork出的子程序退出,程序会返回到perl脚本(fork的父进程)中来,当然,fork子程序的pid也返回到了父进程中,然后在进行if、elsif、else结构的判断。

fork函数之所以能区别父进程和子进程,是因为它对不同的进程返回不同的值,对于子进程返回0,对于父进程返回子进程的pid,但是调用fork函数之后不能保证首先执行哪一个进程。脚本中的第九行的作用是:(虚伪的模拟下,先让fork子进程执行完,然后在去执行父进程,但是问题又来了,如果走到elsif的话,说明父进程已经开始工作了,然后exec的执行结果却出现在了父进程执行的时候,让人大费不解!!!难道是因为exec不清楚缓冲区的缘故???这个地方实在不懂。请高人读了该文章后能够指点迷津,小弟不胜感激!)。