无法清楚地理解fork()系统调用?

时间:2015-11-26 14:31:32

标签: operating-system fork system-calls

在SO上有关于fork()的多个问题,我已经阅读了很长一段时间了。我试图解决这个问题,这个问题如下:

Consider the code fragment:
if(fork==0)
{a = a+5; printf("%d, %d \n", a, &a);}
else{a = a-5; printf("%d, %d \n", a, &a);}

Let u, v be the values printed by the parent process and x, y be the values printed by the child process. Which of the following is true:

a) u = x+10 and v = y
b) u = x+10 and v != y
c) u+10 = x and v = y
d) u+10 = x and v != y

显然,父母和子女进程的地址不同,所以答案必须是b或d。我甚至无法解释u x+10u+10可以x的方式。这究竟是如何工作的? fork()创建两个完整的流程副本。如果fork()返回零,则表示父项正在if块中执行。否则,子进程执行else块中的语句,然后父进程在if块中执行?我的思路是否正确?

1 个答案:

答案 0 :(得分:2)

  

我的思路是否正确?

几乎。

  

fork()创建两个完整的流程副本。

  

显然,父母和子女进程的地址不同

这两个陈述相矛盾。 fork之后没有“重新加载”进程,因此所有地址必须相同。这是可能的,因为CPU的MMU为每个进程创建了一个独特的虚拟地址空间,并且是为了在没有CPU的情况下在CPU上运行而必须大量修改内核的主要原因之一。

  

如果fork()返回零,则表示父项正在if块中执行。

fork()在父项中返回新子项的PID,在子项中返回0。