2016-02-26 46 views
1

我无法弄清楚它是如何工作的。fork系统调用将父进程拆分为两个进程,它为子进程返回零。根据我的输出,子进程应该是glb = 101.var = 89。但是I我错了。有人能解释一下它的工作原理吗?fork调用子进程和父进程之后,值之间会有什么不同?

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

int glb=100; 
int main() 
{ 
    int pid; 
    int var =88; 
    printf ("Before Fork\n"); 
    pid=fork(); 
    if(pid <0) 
    { 
     perror("fork"); 
     exit(1); 
    } 
    if(pid ==0) /**child**/ 
    { 
     glb++;var++; 
    } 
    else 
    { 
     sleep(5); 
    } 

    printf("pid= %d,glb=%d,var=%d\n",getpid(),glb,var); 
    return 0; 
} 
+0

适用于我的作品:'前叉' 'pid = 31955,glb = 101,var = 89' 'pid = 31954,glb = 100,var = 88'什么输出你是否意识到它不会? – dbush

+0

对于孩子不输出“glb = 101,var = 89”你错了吗?它确实输出。 –

+0

是的,现在它确实,我关闭了终端,并再次运行它现在它工作正常。但我有一个问题,他们是在增加订单或可以改变也。谢谢。 – vish22

回答

2

当过程叉,它的地址空间被克隆,所以将有一个单一的段与主线程(其中var所在的位置),但两种方法中的堆栈引用它:

  +-------+ 
parent ---> | var | <--- child 
      +-------+ 

相同适用于glb所在的数据段。

当其中的任何尝试修改它,一个写入时复制产生缺页和数据段是由操作系统复制:

  +--------+ var++ 
parent ---> | 88 | <--- child 
      +--------+ 

Handle cow-fault: 

      +--------+    +--------+ 
parent ---> | 88 | child ---> | 88 | 
      +--------+    +--------+ 

Restart from same instruction: 

      +--------+  var++ +--------+ 
parent ---> | 88 | child ----> | 88 | 
      +--------+    +--------+ 

      +--------+  printf +--------+ 
parent ---> | 88 | child ----> | 89 | 
      +--------+    +--------+ 

所以孩子应该打印101和89,而父母应打印100和88.

相关问题