2016-02-26 51 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.

相關問題