2010-11-19 9 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 

かの子の値子の価値から5に戻ると、なぜ20になったのですか?

答えて

4

fork()は、独自のddressスペース。このアドレス空間は、元のアドレス空間の内容のコピーで満たされる。したがって、1つのプロセスで行われた変更は、他のプロセスに影響を与えません。

つまり、プロセスはメモリを共有しないためです(明示的に強制的にそれらを強制的にmmap()などにしない限り)。

+0

メモリのアドレスをどのように印刷できますか? –

+0

@ Bobj-C: 'printf("%p "、(void *)&value);' –

+0

を使ってアドレスを出力することができます。私は子と親のPIDの同じ出力に16進数値のコードを追加しますか? –

0

親プロセスメモリが子プロセスにコピーされ、子プロセスメモリのそれ以上の変更が親プロセスのメモリに影響しないためです。 fork pitfallsが面白いです。

+0

私はそのチュートリアルにリンクするのをためらうだろう。誤った情報と悪いスタイルがありますが、最悪の場合は完全に標準準拠のコードの周りに '#ifdef __gnu_linux__'を置くことをお勧めしますが、' #ifndef BROKEN_OS'を使用する代わりにconfigure-time 。 –

+0

同意すると、フォークの使用の可能性があるかもしれません。 – khachik

関連する問題