fork系统调用行为的一些解释?

时间:2017-02-17 10:15:21

标签: c linux operating-system fork

我正在学习操作系统考试,现在我看到了fork()系统调用行为的代码。主要目标是绘制由此代码生成的进程树。我做到了,但我无法解释,因为当我运行这段代码时,它打印6次glob的值,其中两个不同而其他所有相等。为什么呢?它不应该打印一个值的glob (确切地说是变量glob的值2)?感谢大家!

这是代码:

int main(int argc,char* argv[]){

int glob=5;
int pid=0;

pid=fork();
glob--;
pid=fork();
glob--;

if (pid!=0) {
    pid=fork();
    glob--; } 

printf("Value=%d\n",glob);

return 0;
}

3 个答案:

答案 0 :(得分:2)

您从流程1开始。

第一次调用fork会创建一个新流程 - 2.

现在,1和2继续运行。两者再次调用fork,您现在已经创建了进程3和4。

现在检查返回的pid是否为0.如果它不是(它不会在进程1和2中),则在进程1和2中再次调用fork并且创建流程5和6。

进程1,2,3,4,5和6现在调用printf

答案 1 :(得分:0)

因为您正在创建三个重复的进程,然后原始和重复的进程操作同时发生,有些操作比其他操作花费的时间更长。

答案 2 :(得分:0)

首次调用fork()后,您有两个变量glob递减到4的进程。

第二次调用fork()后,您有四个变量glob递减到3的进程。

但是,只有那些在第二次通话中作为父母的人(他们在第二次打电话!= 0时收到fork(),这些是总共两个进程)第三次打电话给{{1 (变成四个进程)并将变量fork()再次递减到glob ---这就是父母和孩子,共有四个进程共六个)

因此,总共六个中只有四个进程,执行2的第三个减少,因此,您期望四个glob值,另外两个2