【问题标题】:Not able to understand fork() system call clearly?无法清楚地理解 fork() 系统调用?
【发布时间】:2016-02-29 16:44:23
【问题描述】:

关于 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 块中执行?我的思路对吗?

【问题讨论】:

    标签: operating-system fork system-calls


    【解决方案1】:

    我的思路对吗?

    差不多了。

    fork() 创建两个完全相同的进程副本。

     

    显然父子进程的地址不同

    这两个说法是矛盾的。分叉后没有“重新加载”进程,因此所有地址必须相同。这是可能的,因为 CPU 的 MMU 为每个进程创建了不同的虚拟地址空间,这也是为什么必须对内核进行大量修改才能在没有 MMU 的 CPU 上运行的主要原因之一。

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2011-06-18
      相关资源
      最近更新 更多