
新しいプロセスを生成する呼び出しを実行したときに成功したfork
場合0
(子プロセス)、または親プロセスを返します。
私はこれの後ろに隠れているアイデアを理解していません。なぜfork
いつも返さないか、child
いつもしますかparent
?
答え1
を実行すると、fork()
実行中のコードが両方のプロセスで実行されていることがわかります(フォークが成功したと仮定)。 1 つは親プロセス、もう 1 つは子プロセスです。fork()
子プロセスでは0を返し、親プロセスでは子pidを返します。完全に決定的です。
これは、後でfork()
親または子で実行されているかどうかを確認する方法です。 (また、親プロセスは子プロセスpidをどのように知ることができますか?ある時点でこれを待つ必要があります。)
もっと詳しく:
- 将来の親プロセス呼び出し
fork()
。 - カーネルは新しいプロセスである子プロセスを作成し、さまざまな項目を適切に設定しますが、両方のプロセスが実行されています。同じコードそして、同じ関数が返されるまで「待機」します。
- どちらのプロセスも引き続き実行されます。(必ずしもすぐではなく、同時に必ずしもそうではありませんが、それはポイントではありません):
fork()
子プロセスに0を返します。子プロセスは引き続きこの情報を使用して、子プロセスであることを確認します。fork()
子プロセス pid は親プロセスに返され、親プロセスは引き続きその情報を使用して親プロセスであることを確認します。
答え2
システムfork()
コールは常に「2回返されます」(失敗しない限り)。親プロセスでは子プロセスの PID を返し、子プロセスでは 0 を返します。
一般的なプロセスは
pid_t pid;
int status;
pid = fork();
if (pid == 0) {
run_child_stuff();
exit(0);
} else if (pid > 0) {
run_parent_stuff();
wait(&status); /* wait for child to exit */
} else {
/* handle failure to fork */
}
...または同様です。