fork()函数如何工作?

时间:2015-03-06 23:54:43

标签: fork

可以解释一下这段代码吗?

int main ( ){          
   int i=0 ;
   while (fork() !=0 && i<2)
      i=i+1;
   printf(" this is the process %d and ends with i=%d \n", getpid(), i);
   return 0;
}

据我所知,一个过程父亲有3个孩子! 但根据这个执行输出,我不确定我是否理解了fork函数:

[root@www Desktop]# ./prog1
 this is the process 8025 and ends with i=2 
[root@www Desktop]#  this is the process 8027 and ends with i=1 
 this is the process 8028 and ends with i=2 
 this is the process 8026 and ends with i=0 

谢谢!

1 个答案:

答案 0 :(得分:3)

记住fork()分叉你的进程,导致两个或多或少相同的进程,每个进程的差异是fork()的返回值为0,而子进程为父进程的pid。

您的while循环仅针对父进程进行迭代(它结束于子进程,因为在这些进程中fork()的返回值为0)。因此,第一次通过(i == 0),子进程通过,打印其pid,然后退出。父母仍在。

父母递增i,再次分叉,孩子(i == 1)掉头,打印它的pid并退出。所以这是i == 0的一个退出和i == 1的一个退出。

父级递增i,再次分叉,但我现在是2,所以while循环退出父级和子级进程。两者都以i == 2退出。所以总共有一个退出i == 0,一个退出i == 1,两个退出i == 2.

还要记住其他几点:

  • 进程不保证是顺序的,因此输出可能超出(预期)顺序(如您的示例所示)

  • 优化编译器也可能会破坏排序。使用-O0进行编译可能会使输出(序列)更符合您的预期。

    $ gcc -w -O0 forktest.c && ./a.out
    this is the process 5028 and ends with i=0
    this is the process 5029 and ends with i=1
    this is the process 5030 and ends with i=2
    this is the process 5027 and ends with i=2