2016-03-26 23 views
0
char array[ARRAY_SIZE]; 

void child_process_routine(){ 
int j; 
    for(j = 0;j<ARRAY_SIZE;j++) 
    array[j]='d'; 
} 

main() 
{ 
    pid_t child_pid; 
    int i; 
    for(i = 0;i<ARRAY_SIZE;i++) 
    array[i]='c'; 
    child_pid = fork(); 

     switch (child_pid) { 
     case -1: 
      perror("error");  
      exit(1); 
     case 0: 
      child_process_routine(); 
      exit(0);  
     default: 
      wait(NULL); 
     } 

    print_array(array); 
} 

親プロセスが子プロセスを待たないと、これが再び私に出力「CCCCCC」を与える、なぜあなたは私を説明することができますか?子プロセスで「dddddd」に変更されました親プロセスは子プロセス(Cコード)を待ちません

待機(NULL)とは何ですか?

子プロセスを待つ必要があることをどのように知っていますか?

+0

子は親のアドレス空間のコピーを取得します。 'array []'の変更は子のコピーに対してのみ行われ、親のコピーは変更されません。オペレーティングシステムに応じて、両方のプロセスに変更が表示される特別な「共有」メモリを取得できます。 – EOF

答えて

0

親プロセスは、子プロセスを待ってです。

子はスレッドではなく、独自のPIDを持つ完全に異なるプロセスであり、親はその親PIDです。子と親は同じ配列を共有しません。異なるプロセス(同じプロセスのスレッドではありません)であるため、子は独自のコピーを持ちます。そのため、子プロセスで配列を 'd'に設定すると、親プロセスの配列には影響しません。

終了する直前に子プロセスフローにsleep(20)を置き、親wait()の直前にprintf()を入れてみてください。親が子を終了するのを待っているので、アプリケーションが一時停止していることがわかります。

+0

ええ、グローバル変数がスレッド内のように親と子の間で共有されると仮定しました。あなたの答えに感謝します。質問は厳密には親が更新された配列を印刷することを望んでいますが、どのようにこれを達成するためのアイデアですか? –

+0

親が子が何をしているのかを知る必要がある場合、それらの間にパイプを開き、子が親に話す必要があります。 –

0

fork()は異なるプロセスを作成しますが、親プロセスは同じプロセスコンテキストを共有します。

親のスタックセグメントで何かを変更しようとすると、そのコピーが作成され、子プロセス用に別のスタックが作成されますが、データセグメント、コードセグメントなどのすべてのリソースは子プロセス用にコピーされません。彼らはどちらもそれを共有します。

フォーク後のデータを変更することで、このコピーは、子プロセスが終了するのを

親プロセスが待機している「コピーオンライト」と呼ばれています。しかし、親と子の両方に別々に印刷し、両者のデータを別々に印刷する

関連する問題