このプログラムは hi を 2^3 回出力して終了します fork 呼び出しが main 関数を再帰的に呼び出しているのではないですか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
fork();
fork();
fork();
puts("hi");
return 0;
}
再帰的ではなく、無期限にフォークし続けるわけではありません。そのため、爆弾をフォークしません。fork はmain
呼び出されません。fork が行うことは、現在のプロセス状態のコピーを作成し、 fork 呼び出しから子のコピーに 0 を返し、プロセス ID を親に返すことです。
プログラムを実行すると、元のコピーが正確に 7 つ作成され、合計 8 回の呼び出しが行われputs("hi")
ます。
original copy 1 copy 2 copy 3 copy 4 copy 5 copy 6 copy 7
fork 1 --> created
fork 2 ------------> created
fork 3 ----------------------> created
"hi" "hi"
fork 2 --------------------> created
fork 3 ------------------------------> created
"hi" "hi"
fork 3 -------------------------------> created
"hi" "hi"
fork 3 ----------------------> created
"hi" "hi"
あなたは自分で答えました。fork() は main() を呼び出しません。1 つのプロセスが fork() を呼び出しますが、2 つのプロセスが戻ります (まあ、エラーはないと仮定しています)
したがって、fork()-1 が呼び出され、2 回 (親に 1 つ、子に 1 つ) 返されます。どちらも次のステートメントに移動します。
次に fork()-2 が 2 回 (親で 1 回、子で 1 回) 呼び出され、両方の呼び出しが 2 回 (親で 1 回、子で 1 回) 返されます。
次に fork()-3 が呼び出され、今回は 4 回呼び出され、8 が返されます。それらはすべて印刷され、すべての 'hihihihihihihihi' が画面に送信されます。
forkの man ページを見てください。