2017-02-17 52 views
1

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

这是代码:

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

您是否尝试过在纸上使用铅笔执行跟踪执行,并跟踪这些值? – Dai

+1

“glob”只是一个元变量名称,比如'foo'?它没有很好的选择,因为它遮蔽了一个[POSIX标准函数](https://linux.die.net/man/3/glob),这可能会让人困惑。这不是你看到的问题,但它很混乱。 – unwind

回答

2

你开始与过程1.

fork第一次调用创建一个新的进程 - 2

现在,1和2继续运行。再次呼叫fork,您现在已经创建了过程3和4.

现在检查返回的pid是否为0.如果不是(过程1和过程2不在过程中),请致电fork再次在过程1和2中,并创建过程5和6.

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

+0

在我的工作表上创建了图形。开始时使用了GLOB = 5的进程A,并且现在B使用了B,GLOB = 5。现在A和B现在glob的“glob--”之后是4.现在A和B现在分别在C和D中分配,C和D中的glob是4.在所有进程的“glob-”GLOB之后为3。现在启动IF构造。这只关注进程的父亲,因此A和B进程。在这个语句中,A和B分别创建E和F,然后将GLOB变量减少到2.现在所有的进程都打印Glob的值。对于A和B,值为2,而对于其他的3。 – Joe

+0

@ user5508485对于进程A B E F和对于C D,glob为2 3 –

+0

这是为什么?If语句中的fork系统调用在调用“glob--”之前调用,因此进程E和F应该是GLOB = 3。 – Joe

0

由于您正在创建三个重复的进程,因此原始和重复的进程操作同时发生,某些操作需要比其他操作更长的时间。

0

第一次打电话给fork()后,您有两个过程,变量glob递减到4

在第二次致电fork()后,您有四个过程,变量glob减少到3

不过,只有那名家长在第二个电话的那些(他们收到!= 0从第二次调用fork(),这些都是在总共两个过程)做fork()第三呼叫(成为四个过程)和递减变量glob再次2 ---这就是,父母和孩子,一共有一共有六个的四个过程)

,这样从总六个只有四个过程,做的glob所以第3减量,您期望四个2值和两个更多与3