-2

fork()ループの外側の呼び出しは簡単に理解できますが、ループの内側にあると難しいと思います。このような例で、プロセスがどのように分岐するかを比喩的に説明できる人はいますか?

#include <stdio.h>

int main(){
    int i; 
    for(i=0;i<2;i++)
    {
        fork();
        printf("hi");
        fork();
    }
    exit(0);
}
4

3 に答える 3

2

理想的には、これが当てはまります。

  • 各プロセスで1つの「hi」が印刷されます(procと省略されます)
  • 各フォークはプロセスの数を2倍にします(各プロセスは1つの子を生成します)

計算は、各イベントを追跡することによって実行できます。

  • 開始:1 proc
  • フォーク:2 x 1 = 2 procs
  • 印刷:2 procs-> 2 hi's
  • フォーク:2 x 2 = 4 procs
  • フォーク:2 x 4 = 8 procs
  • 印刷:8 procs-> 8 hi's
  • フォーク:2 x 8 procs-> 16 procs

ここで、hiの数を合計します。

2 +8=合計10hi

ただし、これは必ずしも当てはまりません。システムが異なれば、結果も異なる場合があります。

fork()を呼び出すと、親と同じ子プロセスが生成されます。stdoutの印刷時にバッファリングが行われ、次のフォークの前にバッファがフラッシュされない場合、子は「あるべきではない」ときに印刷されているように見えます。バッファリングの詳細については、この質問を参照してください。

これにより、異なる数のhiが異なるシステムで印刷されます。

于 2012-08-10T20:48:06.353 に答える
1

ループを展開するだけです:

int main() {
    int i;
    fork();
    printf("hi");
    fork();
    fork();
    printf("hi");
    fork();
    exit(0);
}
于 2012-08-10T19:33:01.630 に答える
0

私はこのコードを使用しました:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    int i; 
    for(i=0;i<2;i++)
    {
        fork();
        printf("hi from pid %d\n",getpid());
        fork();
    }
    exit(0);
}

これで、出力を fk.out にパイプしました。

[aft@kruki sf]$ cat fk.out 
hi from pid 6698
hi from pid 6698
hi from pid 6699
.......................

これを見てください:

[aft@kruki sf]$ cat fk.out | awk '{print $4}' | sort | uniq | wc -l

8

8 つのプロセスがあります。こんにちは。stdin バッファが前後に切り替わるため、hi のカウントはあいまいになります。

于 2012-08-10T20:58:35.400 に答える