1

このプログラムは 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;
}
4

2 に答える 2

14

再帰的ではなく、無期限にフォークし続けるわけではありません。そのため、爆弾をフォークしません。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"
于 2012-11-29T19:03:43.053 に答える
1

あなたは自分で答えました。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 ページを見てください。

于 2012-11-29T19:06:25.480 に答える