V6で学ぶカーネルのしくみという本を読んでいます。親子かを識別して別の値を返しているのかが解説されており、とても興味深かったです。以下にその概要をまとめました。fork関数Cではfork関数を利用することで、子プロセスを作成することが出来ます。コードとしてはこんな感じですね。0;}子プロセスは親プロセスのデータをそのままコピーするため、変数などは全て同じ状態になります。fork関数は親プロセスの場合は子プロセスのIDを、子プロセスでは0を返すため、ユーザはfork関数の戻り値を見て、自身が親なのか子なのかを区別できるようになっています。別の値を返しているのでしょうか。V6では)switch関数の仕様を上手く使った実装により実現されていました。fork関数がプロセスの親子を区別する仕組み親による子プロセスの作成ライブラリのfork関数(source/s4/fork.s)を実行すると、システムコールによってカーネルのfork関数(sys/ken/sys1.c)が実行されます。2;}このカーネルのfork関数内でnewproc関数(sys/ken/slp.c)を呼び出し、子プロセスを作成しています。作成した子プロセスのIDをレジスタに乗せ、ライブラリのfork関数で返すようにしています。子プロセスは作成された後、実行順番が回ってきたタイミングでswitch関数(sys/ken/slp.c)により再開します。カーネルのfork関数で呼び出しているnewproc関数(sys/ken/slp.c)内では、savu関数が実行されてから子プロセスがコピーされるため、switch関数はnewprocの呼び出し元であるfork関数に1で戻ります。親プロセスの場合は0が、子プロセスの場合は1が返るようになり、その値を見て自身が親なのか子なのかを判断でき、別々の戻り値を返せるようになっています。ota42yC++/Ruby/RoR/golang/rust/flutter。