fork()
ループの外側の呼び出しは簡単に理解できますが、ループの内側にあると難しいと思います。このような例で、プロセスがどのように分岐するかを比喩的に説明できる人はいますか?
#include <stdio.h>
int main(){
int i;
for(i=0;i<2;i++)
{
fork();
printf("hi");
fork();
}
exit(0);
}
fork()
ループの外側の呼び出しは簡単に理解できますが、ループの内側にあると難しいと思います。このような例で、プロセスがどのように分岐するかを比喩的に説明できる人はいますか?
#include <stdio.h>
int main(){
int i;
for(i=0;i<2;i++)
{
fork();
printf("hi");
fork();
}
exit(0);
}
理想的には、これが当てはまります。
計算は、各イベントを追跡することによって実行できます。
ここで、hiの数を合計します。
2 +8=合計10hi
ただし、これは必ずしも当てはまりません。システムが異なれば、結果も異なる場合があります。
fork()を呼び出すと、親と同じ子プロセスが生成されます。stdoutの印刷時にバッファリングが行われ、次のフォークの前にバッファがフラッシュされない場合、子は「あるべきではない」ときに印刷されているように見えます。バッファリングの詳細については、この質問を参照してください。
これにより、異なる数のhiが異なるシステムで印刷されます。
ループを展開するだけです:
int main() {
int i;
fork();
printf("hi");
fork();
fork();
printf("hi");
fork();
exit(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 のカウントはあいまいになります。