2016-05-20 15 views
0

私はfork()の概念を理解しようとしており、理解できないようなものがあります。fork()とローカル変数の変更?

次のコードで - 子プロセスが5に変更しても、なぜ親プロセスはまだi = 0を出力しますか?

wait(NULL)は、子プロセスが終了するまで親プロセスをブロックします。

int main(int argc, char *argv[]) { 
    int i = 0; 
    if (fork() == 0) { 
    i = 5; 
    } else { 
    wait(NULL); 
    printf("i = %d\n", i); 
    } 
    return 0; 
} 

私の前提が間違っている理由を誰かが説明できますか?

+0

'fork'は何を想像していますか? –

答えて

5

変数はプロセス間で共有されません。 forkへの呼び出し後、2つの完全に別々のプロセスがあります。 forkは、ローカル変数が5に設定されている子で0を返します。forkが子のプロセスIDを返す親では、iの値は変更されません。 forkが呼び出される前に値0が設定されています。それはあなたが2つのプログラムが個別に実行持っていたかのように同じ動作です:

int main(int args, char *argv[]) { 
    int i=0; 
    printf("i = %d\n", i); 
    return 0; 
} 

int main(int argc, char *argv[]) { 
    int i = 0; 
    i = 5; 
    return 0; 
} 
+0

親が実行するときにi = 5を印刷したければ、親に文i = 5を追加せずにどのくらい正確に行うことができますか?要するに、子供と親の間で変数を共有する方法はありますか? – RandomMath

+0

いくつかのIPC(プロセス間通信)メカニズム(ファイル、パイプ、ソケット、共有メモリなど)を使用して、値を子に/から渡す必要があります。 – AhmadWabbi

+0

[ここ] stackoverflow.com/questions/10684499/sharing-same-variable-between-more-than-one-independent-programs-in-linux)。 しかし、あなたはInter Process Communication(IPC)について読む必要があります。 –

1

あなたは子プロセスが親のアドレス空間のアドレス空間のコピーを取得forkすると、彼らは「ドンそれを共有するので、子供が変更されたときi親はそれを見ません。

このアドレス空間のコピーは、決して変更されないメモリの割り当てを避けるために、通常はcopy on writeを使用して行われました。

4

スレッドはプロセスではありません!フォークするときは、フォーク呼び出し時にと同じ値(フォークコールの結果を除く)のみを含む独立したメモリ割り当てを使用して、完全クローンプロセスを作成します。

子プロセスで親プロセスのデータを更新したい場合は、スレッドを使用する必要があります。スレッドは、すべての静的および動的に割り当てられたメモリをその親と共有し、単に独立した自動変数を持ちます。しかし、その場合でも、i変数の静的割り当てを使用する必要があります。

int i = 0; 
int main(int argc, char *argv[]) { 
    ...