3

これは私のコードです:

for (c = 0; c < PROCESSES; c++) {
    pid[c] = fork();
    switch (pid[c]) {
        case -1:
            perror("Faild fork!\n");
            break;
        case 0:
            printf("C = %d\n", c);
            if (c == 0) {
                printf("MY ID0 %d\n", getpid());
                customers();
                break;
            }
            if (c == 1) {
                printf("MY ID1 %d\n", getpid());
                cashier();
                break;
            }
            if (c == 2) {
                printf("MY ID2 %d\n", getpid());
                sales();
                break;
            }
            if (c == 3) {
                printf("MY ID3 %d\n", getpid());
                warehouse();
                break;
            }
            break;

        default:
            if (c == (PROCESSES - 1)) {

                for (j = 0; j < PROCESSES; j++) {
                    w = wait(&state);
                    if (w == -1) {
                        perror("Erro na espera!\n");
                    }
                    printf("Terminar processo %d\n", w);
                }
                sleep(2);
                printf("Fim da simulação.\n\n");
                free_shm_sem();
            }

    }
}

私が期待していたこと:

C = 0
MY ID0 3904
C = 1
MY ID1 3905
C = 2
MY ID2 3906
C = 3
MY ID3 3907

どうした:

C = 0
MY ID0 3904
C = 1
MY ID1 3905
C = 2
MY ID2 3906
C = 3
MY ID3 3907
C = 3
MY ID3 3911

私が変更した場合:

            if (c == 0) {
                printf("MY ID0 %d\n", getpid());
                customers();
                break;
            }
            if (c == 1) {
                printf("MY ID1 %d\n", getpid());
                sales();
                break;
            }
            if (c == 2) {
                printf("MY ID2 %d\n", getpid());
                cashier();
                break;
            }
            if (c == 3) {
                printf("MY ID3 %d\n", getpid());
                warehouse();
                break;
            }

出力は次のようになりました。

C = 0
C = 2
C = 1
MY ID0 3960
MY ID2 3962
C = 3
MY ID1 3961
MY ID3 3963
C = 2
MY ID2 3967
C = 3
MY ID3 3968

なぜ c はその値を変更し、同じ場所を 2 回通過することがありますか?

これは、さまざまなプロセスを実行する fork() n の子の正しい方法ではありませんか?

PS申し訳ありませんが、私の英語は下手です。私が言ったことを理解していただければ幸いです。

4

3 に答える 3

6

すべてのフォークされたプロセスが引き続きforループを繰り返し、さらに多くのプロセスをフォークするという事実を考慮していますか?

最初の反復を考えてみましょう。

for (c = 0; c < PROCESSES; c++) { // c is 0

私たちはフォークをします:

 pid[c] = fork();

さて、子プロセスでは、pid[0]は0です。つまり、

switch (pid[c]) {

に行く:

case 0:
       if (c == 0) {
            printf("MY ID0 %d\n", getpid());
            customers();
            break;
        }

そして、いくつかの印刷を行います。その後、スイッチが切れます。そして、cは0です。したがってc、1に増分し、次のようになります。

 pid[c] = fork();

孫をフォークします。

これを防ぐために、次exitの代わりにできますbreak

        if (c == 0) {
            printf("MY ID0 %d\n", getpid());
            customers();
            exit(0);
        }
于 2013-01-02T01:13:35.723 に答える
1

まず、fork並列プロセスを開始します。順次実行される保証はありません。

于 2013-01-02T01:13:18.267 に答える
1

特別な処理を行う必要があるプロセス(つまり、最初の4つ)forkについては、親プロセスでそれぞれを呼び出す個別のステップを実行します。次に、必要になる可能性のあるすべての汎用プロセスを作成するループを実行します。

于 2013-01-02T01:14:29.407 に答える