web-dev-qa-db-ja.com

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

fork呼び出しを実行して新しいプロセスを作成するときに、成功すると0(子)または親。

私はこれの背後にあるアイデアを思いつきませんでした。なぜforkは常にchildを返すのか、常にparentを返さないのですか?

3
mikmik

fork()を実行すると、実行中のコードが2つのプロセスで実行されていることがわかります(フォークが成功した場合)。一方のプロセスが親プロセスで、もう一方のプロセスが子プロセスです。 fork()は、子プロセスでは0を返し、親プロセスでは子pidを返します。これは完全に確定的です。

これにより、fork()の後に、親と子のどちらで実行しているかを判断できます。 (また、親が子pidを知る方法—ある時点でそれを待つ必要があります。)

もう少し詳しく:

  • 将来の親プロセスはfork()を呼び出します。
  • カーネルは子プロセスである新しいプロセスを作成し、さまざまなものを適切に設定します—しかし、両方のプロセスは実行中同じコードであり、同じ関数からの戻りを「待機」しています。
  • 両方のプロセスが実行を継続します(必ずしもすぐではなく、必ずしも同時にである必要はありませんが、それは要点のほかです):
    • fork()は、子プロセスに0を返します。子プロセスは継続して、その情報を使用して、自分が子であると判断します。
    • fork()は、子pidを親プロセスに返します。親プロセスは続行し、その情報を使用して、それが親であると判断します。
11
Stephen Kitt

fork()システムコールは、「2回戻る」、常に(失敗しない限り)。親では、子プロセスのPIDを返し、子ではゼロを返します。

通常の流れは

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 */
}

... または類似。

2
Kusalananda