fork()
親プロセスと子プロセスで関数が異なる値を返すのはなぜですか?
親プロセスと子プロセスの両方に書き込み操作がないとします。
答え1
親も子も、相手のメモリにpidを入れる必要はありません。
フォークが発生すると、カーネルは親プロセスのプロセス空間全体をコピーします(これは完全なコピーなしで達成できます。たとえば、最初にページテーブルエントリをコピーしていくつかのメモリに書き込む方法です)。
システムコールの間、カーネルはユーザプロセスをユーザモードで返す前にユーザプロセススタックを回復し、コールの戻り値を渡すことができる。システムコールのすべての戻り値が出るところです。
カーネルが親と子の値が異なる2つのスタックフレームを変更することはまったく問題ではありません。どちらのプロセスも実行されておらず、両方がシステムコール中であるため、スタックフレームが明確に定義されており、すべてのメモリがカーネルにアクセスできます。