可以解释一下这段代码吗?
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
谢谢!
答案 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