フォークが親を返すこともあれば、子を返すこともあるのはなぜですか?

フォークが親を返すこともあれば、子を返すこともあるのはなぜですか?

fork新しいプロセスを作成するための呼び出しを実行すると、成功した場合は0(子) または親のいずれかが返されます。

この背後にある考え方がわかりません。なぜforkalways returnchildまたは alwaysではないのでしょうかparent?

答え1

を実行するとfork()、実行中のコードは 2 つのプロセスで実行されていることがわかります (フォークが成功したと仮定)。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 */
}

... または類似。

関連情報