我正在学习操作系统考试,现在我看到了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;
}
答案 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
。