4

次の C プログラムの結果を伝える必要があります。

main()
{
    int pid, k, som;
    som = 0; k = 2;
    pid = fork();
    if(pid == 0)
        k=5;
    else
        wait(0);
    for(int i = 1; i <= k; i++)
        som += i;
    printf("%d", som);
}

私の最初の期待は 3 です。fork 呼び出しが行われると、プロセスのメモリがコピーされ、両方のプログラムが実行されます。次に子プロセスが実行されますが、k は 2 のままです。したがって、最後に 1 + 2 = 3 を実行します。

しかし、このプログラムが実行されると、153 が出力されます。なぜそれが出力されるのか、最も近い手がかりがありません。

誰でも理由がわかりますか?

4

4 に答える 4

15

その理由は、2 つのプロセスが同じコンソールに出力されているためです。「fork」は、1 回呼び出されて 2 回戻る unix/linux コマンドです。戻り値の 1 つは fork を呼び出した元のプロセスにあり、生成された子プロセスの PID を返します。2 番目の戻り値は 0 で、これは子プロセスであることを示します。

プログラムの 1 つである私が信じている子供が最初に実行され、値として 15 が計算され、最後にコンソールに出力されます。親プログラムは、wait(0) のために 2 番目に実行され、値 3 を生成します。

于 2009-06-18T20:06:40.167 に答える
4

153子と親によって印刷されます。

于 2009-06-18T20:09:02.610 に答える
2

A は親、B は子です。重要な行は次のとおりです。

A: pid = fork(); // returns 0 for the child process
A: wait(0);
B: k = 5;
B: for(int i = 1; i <= k; i++) som += i; // som = 15
B: printf("%d", som); // prints 15, B finishes, goes back to A
A: for(int i = 1; i <= k; i++) som += i; // som = 3
A: printf("%d", som); // prints 3
于 2009-06-18T20:11:07.333 に答える
0

値の間に改行が印刷されていないため、親の回答は子の回答の直後に表示されます。

値の原因については Jared が正しい。

于 2009-06-18T20:10:52.310 に答える