叉重复两次?

时间:2012-09-18 03:06:58

标签: c fork

#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? Child为ab提供了自己的虚拟内存,那么我们如何将该结果传输给父级? 我很困惑。


进一步调查 当我将return 0插入case 0时,它不会重复。看起来switch语句仍在继续。我错过了关于switch语句的内容吗?

3 个答案:

答案 0 :(得分:8)

在C中,默认情况下switch语句属于case;你必须在每个案例的末尾加上break;(或return)语句,否则,例如,孩子将同时执行子代码和父代码。

答案 1 :(得分:5)

您的案件中没有break个陈述,因此每个案件都会进入下一个案件。具有pid == 0的子项将执行 0 默认案例块。

答案 2 :(得分:0)

当fork将两个pid的一个返回到父进程而另一个返回到子进程时,对于parent,它返回&gt; 0 pid并且对于子节点返回0作为pid。因此0的情况会被执行但是no break因此也会执行默认值,因为在没有break语句的情况下,switch case会掉线....