私は、fork()
関数がその親と同一のプロセスを作成することを知っていますが、それが持つPIDによってのみ異なります。それらは最初は同じ変数を持っており、これらの変数に加えられた変更は互いに影響しません。しかし、グローバルポインタ変数が共有されるとどうなりますか?
私はいくつかのコードを書き、結果を印刷しました。親プロセスと子プロセスには同じメモリ位置を指すポインタがあるように見えますが、これらのメモリ位置に加えられた変更、つまり*p = 1
親と*p = 2
子での変更は相互に影響しません。wait(NULL)
また、子プロセスが終了するまで親プロセスを作成することにも注意してください。したがって、子プロセスは、親プロセスのポインタと同じメモリアドレスを持つポインタが指す値を変更します。
いつfork()
呼び出されるかはわかっていますが、親プロセスはレジスター、プログラムカウンターなど、すべてのクローンを作成します。しかし、それはどのようにして可能でしょうか。子プロセスが終了した後、親プロセスの変数の値を変更するべきではありませんか?システムがすべて(親プロセスのポインタ変数を含む)をスタックに置き、子が終了したときにそれらをポップするためですか?