1
#include <stdio.h>
#include <unistd.h>

int main()
{
    int a = 1, b = 1;
    int rval, pid;

    pid = fork();
    switch(pid)
    {
        case -1:
            printf("I am bad.\n");

        case 0:
            printf("I am in child.\n");
            rval = a + b;
            printf("leaving child.\n");
        default:
            wait();
            printf("I am back to parent.\n");
            //wait();
            printf("%d \n", rval);
            printf("leaving parent.\n");
    }
    return 0;
}

私は最初に子の発言を期待し、次に親を期待していました。しかし、レプションがあってはなりません。その代わり、

>> ./demo
I am in child.
leaving child.
I am back to parent.
2 
leaving parent.
I am back to parent.
134513584 
leaving parent.

親は2回繰り返されます。何故ですか?さらに、親はどのように2して子供から得たのですか?子には独自の仮想メモリがあるのでabその結果を親にどのように転送しましたか?私は混乱しています。


さらなる調査に挿入return 0するcase 0と、繰り返されません。switchステートメントが続くようです。switchステートメントについて何か見落としましたか?

4

3 に答える 3

9

Cでは、switchステートメントはデフォルトで大文字と小文字を区別します。break;各ケースの最後に(または)ステートメントを配置する必要がありますreturn。そうしないと、たとえば、子は子と親の両方のコードを実行します。

于 2012-09-18T03:10:29.130 に答える
6

ケースにステートメントがないbreakため、各ケースは次のケースに分類されます。の子は、 0デフォルトpid == 0の両方のケースブロックを実行します。

于 2012-09-18T03:10:30.657 に答える
0

forkは2つのpidを1つは親プロセスに返し、もう1つは子プロセスに返すため、親の場合は> 0pidを返し、子の場合はpidとして0を返します。したがって、case for 0が実行されno breakますが、breakステートメントがない場合はswitch caseが失敗するため、デフォルトも実行されます。

于 2012-09-18T05:57:07.503 に答える