web-dev-qa-db-ja.com

これらのfork()ステートメントでいくつのプロセスが作成されますか?

これにより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;
}
13
Ben Reed

これを介して推論するのはかなり簡単です。 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
  1. フォーク#1は追加のプロセスを作成します。これで2つのプロセスができました。
  2. フォーク#2は2つのプロセスによって実行され、2つのプロセスを作成して、合計4つになります。
  3. フォーク#3は4つのプロセスによって実行され、4つのプロセスを作成して、合計8つになります。それらの半分にはpid==0があり、残りの半分にはpid != 0があります
  4. フォーク#4は、フォーク#3によって作成されたプロセスの半分(つまり、4つ)によって実行されます。これにより、4つの追加プロセスが作成されます。これで12個のプロセスができました。
  5. フォーク#5は残りの12のプロセスすべてによって実行され、さらに12のプロセスが作成されます。あなたは今24を持っています。
31
sfstewman

このように計算します:

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になりました

3
Roshan Mehta

あなたは正しいです。それは24です。最後のreturnステートメントの前に、コンパイルしてw/printfで実行しました。 24行の出力を取得しました。

1
willus

このステートメントには24以上の子プロセスがあります。 fork()を呼び出すたびに、子と親の2つのプロセスが発生します。したがって、最初のフォークは2つのプロセスになります。 2番目のfork()は、これら2つのプロセスによって到達され、4つのプロセスを生成します。最後のfork()は、4つのプロセスによって到達され、8つのプロセスをさらに獲得します。これらのプロセスの1つを除くすべて(オリジナル)は、少なくとも1つのフォークの子です。

0
Moeez Mehmood