15

これにより 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;
}
4

4 に答える 4

35

It's fairly easy to reason through this. The fork call creates an additional process every time that it's executed. The call returns 0 in the new (child) process and the process id of the child (not zero) in the original (parent) process.

pid_t pid = fork();  // fork #1
pid = fork();        // fork #2
pid = fork();        // fork #3
if (pid == 0)
{
  fork();            // fork #4
}
fork();              // fork #5
  1. Fork #1 creates an additional processes. You now have two processes.
  2. Fork #2 is executed by two processes, creating two processes, for a total of four.
  3. Fork #3 is executed by four processes, creating four processes, for a total of eight. Half of those have pid==0 and half have pid != 0
  4. Fork #4 is executed by half of the processes created by fork #3 (so, four of them). This creates four additional processes. You now have twelve processes.
  5. Fork #5 is executed by all twelve of the remaining processes, creating twelve more processes; you now have twenty-four.
于 2013-10-01T01:47:09.963 に答える
3

次のように計算します。

1(メイン プロセス) から開始し、フォークが内部にない場合はフォークごとに 2 回作成します。

あなたのコードでは: 1P #1 の fork() を得たので、現在のプロセス数を 2 倍にします。プロセス 2P の新しい番号

#2 fork() を取得したので、現在のプロセス数を 2 倍にします。今新しいプロセス数 4P

#3 fork() を取得したので、現在のプロセス数を 2 倍にします。今新しいプロセス数 8P

#4 fork() を取得しましたが、if 条件にあるので (8+4 = 12)P を待ちます

#5 fork() を取得したので、現在のプロセス数を 2 倍にします。今新しいプロセス数 24P

于 2015-10-17T01:51:42.227 に答える
1

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

于 2013-10-01T01:41:06.193 に答える