これにより24のプロセスが作成されると思います。ただし、確認が必要です。これらの質問はしばしば私を困惑させます。助けてくれてありがとう!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid = fork();
pid = fork();
pid = fork();
if (pid == 0)
{
fork();
}
fork();
return 0;
}
これを介して推論するのはかなり簡単です。 fork
呼び出しは、実行されるたびに追加のプロセスを作成します。この呼び出しは、新しい(子)プロセスでは0
を返し、元の(親)プロセスでは子(ゼロではない)のプロセスIDを返します。
pid_t pid = fork(); // fork #1
pid = fork(); // fork #2
pid = fork(); // fork #3
if (pid == 0)
{
fork(); // fork #4
}
fork(); // fork #5
pid==0
があり、残りの半分にはpid != 0
がありますこのように計算します:
1(メインプロセス)から開始し、フォークが内部にない場合はすべてのフォークで2回作成しますif(pid == 0)そうでない場合は、現在のプロセスの1/2を現在のプロセス数に追加します。
あなたのコードでは:1P Got#1 fork()なので、現在のプロセス数を2倍にします。プロセス数2Pになりました
#2 fork()を取得したため、現在のプロセス数が2倍になりました。今プロセスの新しい数4P
#3 fork()を取得したため、現在のプロセス数が2倍になりました。今新しいプロセス数8P
#4 fork()を取得しましたが、if条件が満たされるまで待機します(8 + 4 = 12)P
#5 fork()を取得したので、現在のプロセス数を2倍にします。プロセス数が24Pになりました
あなたは正しいです。それは24です。最後のreturnステートメントの前に、コンパイルしてw/printfで実行しました。 24行の出力を取得しました。
このステートメントには24以上の子プロセスがあります。 fork()を呼び出すたびに、子と親の2つのプロセスが発生します。したがって、最初のフォークは2つのプロセスになります。 2番目のfork()は、これら2つのプロセスによって到達され、4つのプロセスを生成します。最後のfork()は、4つのプロセスによって到達され、8つのプロセスをさらに獲得します。これらのプロセスの1つを除くすべて(オリジナル)は、少なくとも1つのフォークの子です。