Chinaunix首页 | 论坛 | 博客
  • 博客访问: 858813
  • 博文数量: 253
  • 博客积分: 6891
  • 博客等级: 准将
  • 技术积分: 2502
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-03 11:01
文章分类

全部博文(253)

文章存档

2016年(4)

2013年(3)

2012年(32)

2011年(184)

2010年(30)

分类: Python/Ruby

2011-08-26 13:58:15

fork()函数: 
作用:进程复制函数。 
用法:$pid=fork();    
讲解: 
无参数;当本进程为父进程时返回值为子进程的PID值,当进程为子进程时返回值为0。如果fork失败,则$pid是undefined.
  1. #!/usr/bin/perl -w

  2. use strict;

  3. defined(my $pid = fork()) or die "Fork process failured:$!\n";
  4. unless($pid){
  5.         system "date";
  6.         sleep(3);
  7.         print "Exit child after 3 sec\n";
  8.         exit();
  9. }
  10. waitpid($pid, 0);
  11. system "date";

  12. print "exit parent\n";
[root@localhost perl_scripts]# perl fork_1.pl
Fri Aug 26 13:39:09 CST 2011
Exit child after 3 sec
Fri Aug 26 13:39:12 CST 2011
exit parent


如果不在父进程中提供waitpid函数的话,父进程会在成功创建子进程后不等待子进程执行完毕,立即执行其余的代码,这样的话执行的结果如下:

# perl fork_1.pl
Fri Aug 26 13:39:09 CST 2011
Fri Aug 26 13:39:09 CST 2011
exit parent!
# Exit child after 3 seconds wait!

fork以后,子进程从fork点开始和主进程运行相同的程序,所以可以通过测试$pid来使主进程和子进程运行不同的程序,子进程所做的工作结束后应该退出,不然会继续运行if代码块以后的主进程的程序,这样会运行两次主进程的程序。
  1. #!/usr/bin/perl -w

  2.         my $pid = fork();
  3.         if (not defined($pid)){
  4.            print "not successful\n";
  5.         }elsif($pid != 0) {
  6.                 print "is parent\n";
  7.         } else {
  8.                 # this is the child process
  9.                 print "is child\n"; #子进程退出,会继续运行if一下的程序。
  10.         }

  11.         print 'program after "if"'."\n" #会打印两次,一次是主进程打印,一次是子进程打印的。
调用fork后有两个名字一样的进程在运行。可是运行的code是不一样的。
$pid 可以为0, 不为0的数,或undefined.
  1. #!/usr/bin/perl -w
  2. use strict;

  3. my $pid = fork();
  4. if (not defined($pid)){
  5.     print " not avilable\n";
  6. }elsif($pid == 0){
  7.     print "the child\n";
  8.     sleep(2);
  9.     exit();
  10. }else{
  11.     waitpid($pid, 0);
  12.     print "parent parent\n";
  13. }
  14. #}
  15. print "HIYA\n";



the child
parent parent
HIYA


其实fork的时候已经两个分支了,数据段被复制了一份,因此pid有两份

执行pid=fork()时,返回值赋给pid在两个进程中运行,

fork会返回给父进程的那个> 0的值,告诉调用者新建进程的pid
子进程的fork返回值是0

更不用说if...else的比较也是在两个进程中都做的了


为什么 I'm child 和 I'm parent 都会被显示?这是因为 fork 调用时, 当前的进程会从 fork 的位置一分为二,fork 对两个进程的返回值不同。 在父进程中 fork 返回子进程(即另一个进程)的进程id,而在子进程中 fork 返回 0。 上例的执行过程如下图。

fork-test.png

上例中执行到 Program started 时,只有一个进程 8934,而执行到 fork 时, 进程分为两个,父进程为 8934,子进程为 8935。接下来父进程执行 if 分支, 输入“I'm parent..”,而子进程执行 else 分支,输出 “I'm child”。


在父进程中利用 waitpid 函数。该函数回收指定进程的资源, 并返回已结束进程的进程id。若指定进程不存在,则返回 -1。










阅读(706) | 评论(0) | 转发(0) |
0

上一篇:Perl包和模块:require

下一篇:Getopt::Std

给主人留下些什么吧!~~