#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) を返します。また、条件演算子は省略形です。