それほど難しいことではありません。fork()システムコールのカーネルの半分は、前述のようにプロセス制御ブロックを介して2つのプロセスの違いを認識できますが、それを行う必要はありません。したがって、擬似コードは次のようになります。
int fork()
{
int orig_pid = getpid();
int new_pid = kernel_do_fork(); // Now there's two processes
// Remember, orig_pid is the same in both procs
if (orig_pid == getpid()) {
return new_pid;
}
// Must be the child
return 0;
}
編集:
ナイーブバージョンは、説明どおりに機能します。新しいプロセスコンテキストを作成し、関連するすべてのスレッドコンテキストをコピーし、すべてのページとファイルマッピングをコピーし、新しいプロセスを「実行準備完了」リストに追加します。
あなたが混乱しているのは、これらのプロセスが再開するとき(つまり、親がkernel_do_forkから戻り、子が初めてスケジュールされるとき)、関数の途中で開始する(つまり、最初に実行する)ことだと思います。 'もしも')。これは正確なコピーです。両方のプロセスが関数の後半を実行します。