在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+10
或u+10
可以x
的方式。这究竟是如何工作的? fork()
创建两个完整的流程副本。如果fork()
返回零,则表示父项正在if
块中执行。否则,子进程执行else
块中的语句,然后父进程在if
块中执行?我的思路是否正确?
答案 0 :(得分:2)
我的思路是否正确?
几乎。
fork()
创建两个完整的流程副本。
显然,父母和子女进程的地址不同
这两个陈述相矛盾。 fork之后没有“重新加载”进程,因此所有地址必须相同。这是可能的,因为CPU的MMU为每个进程创建了一个独特的虚拟地址空间,并且是为了在没有CPU的情况下在CPU上运行而必须大量修改内核的主要原因之一。
如果
fork()
返回零,则表示父项正在if
块中执行。
fork()
在父项中返回新子项的PID,在子项中返回0。