3

次のコードを検討してください。

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>

/* main --- do the work */

int main(int argc, char **argv)
{
    pid_t child;

    if ((child = fork()) < 0) {
        fprintf(stderr, "%s: fork of child failed: %s\n",
            argv[0], strerror(errno));
        exit(1);
    } else if (child == 0) {
                    // do something in child
            }
    } else {
    // do something in parent
    }
}

私の質問は、子プロセスが実行を開始するコードのどこから、つまりどの行が最初に実行されるのかということです?? コード全体を実行すると、独自の子プロセスも作成され、確実に発生するわけではありません!!!

fork() コマンドの後に開始する場合、最初はどのように if ステートメントに入るのですか??

4

5 に答える 5

7

実行するとfork()、スレッドがメモリに複製されます。

したがって、実際には、投稿したスニペットを実行する 2 つのスレッドが存在することになりますが、それらのfork()戻り値は異なります。

子スレッドfork()は 0 を返すため、他のブランチはif実行されず、親スレッドでも同じことが起こります。

fork()呼び出されると、オペレーティング システムは、生成される新しいスレッドに新しいアドレス空間を割り当て、それを開始します。両者は同じコード セグメントを共有しますが、戻り値が異なるため、コードの異なる部分を実行します。 (あなたの例のように正しく分割されている場合)

于 2012-04-16T16:04:57.510 に答える
7

fork 関数の戻りで子の実行を開始します。コードの先頭ではありません。fork は、親プロセスでは子の pid を返し、子プロセスでは 0 を返します。

于 2012-04-16T16:05:01.497 に答える
2

子は、フォークの後に次の命令 (行ではない) を実行することから始めます。したがって、あなたの場合は、フォークの戻り値を子変数に代入することです。

于 2012-04-16T16:06:08.040 に答える
0

あなたの質問を正しく理解していれば、あなたのコードはすでにプロセスとして実行されると言えます。fork() の後、別のプロセス (子プロセス) ができます。

Unix では、プロセスが別のプロセスを作成できるため、それが発生します。

于 2012-04-16T16:11:40.713 に答える