0

フォークの後、子は最初からプログラムを開始しますか、それとも親の場所から開始しますか?

たとえば、このプログラムでは、子は 1 行目と 3 行目から始まりますか?

int i=1
fork()
i=i*2
fork
i=i*2
4

4 に答える 4

7

fork() は、呼び出しプロセスを複製して新しいプロセスを作成します。子と呼ばれる新しいプロセスは、次の点を除いて、親と呼ばれる呼び出しプロセスの正確な複製です: […]

からfork(2)

これは完全に複製されているため、同じ命令ポインタとスタックも持ちます。したがって、子は への呼び出しの直後になりますfork()。現在のプログラムが子プログラムか親プログラムかを調べるにはどうすればよいですか? 戻り値のマンページを参照してください。

成功すると、子プロセスの PID が親に返され、0 が子に返されます。失敗すると、親に -1 が返され、子プロセスは作成されず、errno が適切に設定されます。

したがって、 の結果fork()が に等しい場合は子プロセスにあり、親0よりも大きい場合は子プロセスにあり、下にある場合は問題があります。00

これは、 の結果値に依存しないすべてのコードが、子と親の両方fork()で実行されることを意味することに注意してください。たとえば、16 プロセスのプールを作成する場合は、次のようにする必要があります。

for (int i = 0; i < 16; i++) {
    pid_t pid = fork()
    if (pid == 0) {
        do_some_work();
        exit(0);
    } else if (pid < 0) {
        // fork failed
        do_some_error_handling();
    }
}

を見逃すとexit(0)、2¹⁶-1 個のプロセスが生成されます (16 個ではなく 100 個しかありません。面白くありません)。

于 2012-07-02T05:39:48.647 に答える
0

分岐は、分岐が発生したポイントである 3 行目から始まります。

于 2012-07-02T05:37:18.750 に答える
0

fork が戻ると、親 (子の PID を返す) と子 (0 を返す) の両方で戻ります。そこから、親と子の両方で実行が続行されます。

そのため、 fork の典型的な使用法は次のようなものです。

if (0 == (child = fork()))
    // continue as child.
else
    // Continue as parent.
于 2012-07-02T05:40:53.217 に答える
0

Child2 行目で作成されますがfork()、3 行目から実行が開始されi = i*2ます。ここで私を混乱させているのは、4行目です。そこで何をしようとしていますか?

于 2012-07-02T05:46:25.783 に答える