フォークシステムコールはどのように機能しますか?

フォークシステムコールはどのように機能しますか?

この例を見ると

#include <stdio.h>
#include <unistd.h>

void main(){
  int pi_d ;
  int pid ;
  pi_d = fork();
  if(pi_d == 0){
    printf("Child Process B:\npid :%d\nppid:%d\n",getpid(),getppid());
  }
  if(pi_d > 0){
    pid = fork();
    if(pid > 0){
      printf("\nParent Process:\npid:%d\nppid :%d\n",getpid(),getppid());
    }
    else if(pid == 0){
      printf("Child Process A:\npid :%d\nppid:%d\n",getpid(),getppid());
    }
  }
}

私にとって、これはプロセスを分岐すると親プロセスのコピーが作成されるため、プロセスを無限に生成するようです。このようにしてプログラムコードが複製される。

これは、それぞれの新しいプロセスが同じコードを実行するためなどをpi_d = fork()呼び出すことを意味します。

私がここで何を見逃しているのでしょうか?

答え1

から引用POSIX フォーク定義(太い強調内):

戻り値

正常に完了すると、fork()は子プロセスに0を返し、親プロセスに子プロセスのプロセスIDを返します。fork() どちらのプロセスもこの関数で実行し続ける必要があります。。それ以外の場合、-1は親プロセスに返され、子プロセスは生成されず、errnoエラーを示すように設定する必要があります。

OPは次のよ​​うに書きました。

これは、すべての新しいプロセスに対して同じコードを実行することを意味します。

無事に終えてfork()帰ってきた後両親と子供はすぐに回復しますfork():最初の項目は再実行されずfork()、最初または2番目の項目も再実行されません。fork()このコードには、このようなことを起こすループがないためです。

エラーが発生しなかったとします(検査なし)。

  • 親フォーク
    • サブモニタの場合Child Process B
    • そうではなく、両親なら再びフォークしてください。
      • (再)親の場合は表示Parent Process
      • 親の2番目の子の場合は、次のようになります。Child Process A

3つの出力は、任意の順序または混合で発生する可能性があります(ただし、特定のオペレーティングシステムでは、1つの表示順序が他のものよりも大きくなければなりません)。 )。表示順序がより頻繁に発生し、Child Process Bリードがある順序が最初に表示されることがあります。

関連情報