#include <unistd.h>
   int main()
    { 
      fork();
      fork() && fork() || fork();
      fork();  
      printf(“forked\n”);
      return 0;
    }
このプログラムを理解するのを手伝ってください。なぜ20回印刷されているのですか?
   #include <unistd.h>
   int main()
    { 
      fork();
      fork() && fork() || fork();
      fork();  
      printf(“forked\n”);
      return 0;
    }
このプログラムを理解するのを手伝ってください。なぜ20回印刷されているのですか?
基本的に、すべてのフォークは 2 つのプロセスにつながります。
式fork() && fork() || fork();では、各fork()呼び出しが実行されるわけではありません。
呼び出しは、呼び出し側プロセスでは子のfork()PID で返され、新しい子プロセスでは 0 で返されます。
この行がいずれかのプロセス A で実行されると、最初の行は 1 つの新しいプロセス B につながります。この行は両方のプロセスで継続されます。2 つ目は A で実行されますが、B では実行されません。したがって、A は新しい子 C を取得します。3 つ目は B と C で実行されますが、A では実行されず、D と E につながります。
したがって、この行には 5 つのプロセスがあります。
この行は 2 つのプロセスで実行されます。これは、先行fork();する 1 つの行がそれらにつながるためです。
これで、10 個のプロセスがあり、それぞれが finalfork();を実行するため、20 個のプロセスが得られます。
それ以外の
printf("forked\n");
あなたができる
printf("forked %d <- %d\n", getpid(), getppid());
プロセス間の関係を確認します。
ここで、呼び出しごとfork()に新しいプロセスが作成され、一方のプロセスの戻り値は 0 であり、もう一方のプロセスの戻り値は正の値 (pid ですが、ここでは関係ありません) であることを思い出してください。したがって、コードがある場合
fork(); fork(); fork();
最終的には 8 つのプロセスになります。元の子は最初のフォークで作成され、次にこれらの両方で 2 番目のフォークで作成された子 (現在合計 4 つ)、そしてこれら 4 つすべてで 3 番目のフォークで作成されたもう 1 つの子です。
次に、コードの明確化されたバージョンを検討してください。
#include <unistd.h>
#include <stdbool.h> // to have bool type for correct code
int main()
{ 
    fork();
    // (fork() && fork()) || fork() opened up
    {
        bool tmp = fork(); // 0 implicitly cast to false, nonzero to true
        if (tmp) {
            tmp = fork();
        }
        if (!tmp) {
            tmp = fork();
        }
    }
    fork();  
    printf(“forked\n”);
    return 0;
}
したがって、これにより生成されるプロセスが最大 20 個になり、それぞれが最終的にprintf. 正確には、脳のエクササイズが必要な場合は、頭の中でそれを処理できます(紙とペンを使用してください)。デバッガーでそれを行うことは、すべてのフォークのおかげで無駄なエクササイズです。
これを参照してください:
http://www.geeksforgeeks.org/fork-and-binary-tree/
fork() は、子プロセスでは 0 を返し、親プロセスでは非ゼロ (子プロセス PID) を返します。また、条件演算子は省略形です。