2010-11-19 91 views
1

而我學習操作系統當然,我不明白爲什麼下面的代碼的輸出類似這樣的任何人都可以解釋這個輸出(操作系統)?

代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 

int main (int argc, const char * argv[]) { 

    int value = 5; 


    pid_t pid = fork(); 
    printf("pid = %d \n",pid); 
    if (pid == 0){ 
     value+=15;  
     printf("Value ch :%d \n",value); 
    } 
    else { 
     if (pid > 0) { 
      wait(NULL); 
      printf("Value pr :%d \n",value); 
      exit(1); 
     } 

    } 

    return 0; 
} 

OUTPUT:

run 
[Switching to process 24752] 
Running… 
pid = 24756 
pid = 0 
Value ch :20 
Value pr :5 

如果孩子值變成20爲什麼從孩子返回後值= 5

回答

4

因爲fork()創建了一個新的進程,地址空間。該地址空間填充了原始地址空間內容的副本。因此,一個過程中所做的更改不會影響另一個過程。

換句話說,這是因爲進程不共享內存(除非您明確強制使用mmap()等)。

+0

如何打印內存地址? – 2010-11-19 15:53:06

+0

@ Bobj-C:你可以使用'printf(「%p」,(void *)&value)打印一個地址;' – 2010-11-19 16:03:19

+0

我在子代和父代PID的相同輸出中添加一個十六進制值的代碼? – 2010-11-19 16:07:35

0

由於父進程內存被複制到子進程,並且子進程內存中的進一步更改不會影響父進程。 fork pitfalls很有趣。

+0

我會猶豫是否要鏈接該教程。它有很多錯誤信息和糟糕的風格,其中最糟糕的可能是圍繞完全符合標準的代碼對'#ifdef __gnu_linux__'進行推薦,而不是在其周圍使用'#ifndef BROKEN_OS'並在配置時檢查損壞的系統。 – 2010-11-19 15:55:34

+0

同意,它只是說明叉使用的一些可能的影響,也許,以一種嚴重的方式。 – khachik 2010-11-19 16:00:04

相關問題