-2
   #include <unistd.h>
   int main()
    { 
      fork();
      fork() && fork() || fork();
      fork();  
      printf(“forked\n”);
      return 0;
    }

このプログラムを理解するのを手伝ってください。なぜ20回印刷されているのですか?

4

3 に答える 3

1

基本的に、すべてのフォークは 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());

プロセス間の関係を確認します。

于 2013-10-23T11:37:36.200 に答える
1

ここで、呼び出しごと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. 正確には、脳のエクササイズが必要な場合は、頭の中でそれを処理できます(紙とペンを使用してください)。デバッガーでそれを行うことは、すべてのフォークのおかげで無駄なエクササイズです。

于 2013-10-23T11:30:10.970 に答える
0

これを参照してください:

http://www.geeksforgeeks.org/fork-and-binary-tree/

fork() は、子プロセスでは 0 を返し、親プロセスでは非ゼロ (子プロセス PID) を返します。また、条件演算子は省略形です。

于 2013-10-23T11:36:06.077 に答える