+ -
当前位置:首页 → 问答吧 → 有关fork的疑问

有关fork的疑问

时间:2011-06-21

来源:互联网

有这样一段代码:在子进程中好像不是按顺序执行的,他先执行了sleep,而不是先执行print,难道在子进程中就不按序执行了吗?
  1. for (my $i = 0; $i < 10; $i ++) {
  2.     ## == fork a new process ==
  3.     my $pid = fork();
  4.     if (!defined($pid)) {
  5.         print "Error in fork: $!";
  6.         exit 1;
  7.     }
  8.     if ($pid == 0) {
  9.         ## == child proc ==
  10.         print "Child $i : My pid = $\n";
  11.         sleep(5);
  12.         print "Child $i : end\n";
  13.         exit 0;
  14.     }
  15.     sleep(1);
  16. }

  17. exit 0;
复制代码

作者: kingwmj   发布时间: 2011-06-21



QUOTE:
有这样一段代码:在子进程中好像不是按顺序执行的,他先执行了sleep,而不是先执行print,难道在子进程中就不 ...
kingwmj 发表于 2011-06-21 09:15




    buffer,兄弟,buffer.

作者: 兰花仙子   发布时间: 2011-06-21

回复 兰花仙子


    姐姐,能再说详细一点吗?还是不太理解啊。

作者: kingwmj   发布时间: 2011-06-21

加一句:$|++;

作者: 兰花仙子   发布时间: 2011-06-21

回复 兰花仙子


    谢谢仙子姐姐,print 到屏幕也有buffer问题啊,我还以为只有写硬盘才会有这种问题。再请教一下,怎样才能让所有的子进程都结束以后,再进行下一步的工作?比如下面的代码,让最后的print 在所有子进程都结束以后运行?
  1. use strict;
  2. use warnings;

  3. for (my $i = 0; $i < 10; $i ++) {
  4.     ## == fork a new process ==
  5.     my $pid = fork();
  6.     if (!defined($pid)) {
  7.         print "Error in fork: $!";
  8.         exit 1;
  9.     }
  10.     if ($pid == 0) {
  11.         ## == child proc ==
  12.         $|++;      
  13.        print "Child $i : My pid = $\n";
  14.         sleep(5);
  15.         print "Child $i : end\n";
  16.         exit 0;
  17.     }
  18.     sleep(1);
  19. }

  20. print "all child process is end\n";
复制代码

作者: kingwmj   发布时间: 2011-06-21



QUOTE:
回复  兰花仙子


    谢谢仙子姐姐,print 到屏幕也有buffer问题啊,我还以为只有写硬盘才会有这种问题 ...
kingwmj 发表于 2011-06-21 10:15




(1) $|++放在开头就行。
(2)用waitpid回收子进程,见置顶帖子里我的示例。

作者: 兰花仙子   发布时间: 2011-06-21

回复 兰花仙子


    好的,谢谢仙子姐姐,刚接触这块,有很多东西还不懂啊。

作者: kingwmj   发布时间: 2011-06-21