C 叉子重复两次?

C 叉子重复两次?,c,fork,C,Fork,父母重复两次。为什么呢? 此外,父母是如何从孩子那里得到2?孩子的a和b有自己的虚拟内存,那么我们如何将结果传递给家长呢? 我很困惑 进一步调查 当我将return 0插入案例0时,它不会重复。看起来switch语句仍在继续。我是否遗漏了switch语句的某些内容?在C中,switch语句在缺省情况下是通过case实现的;你必须把一个中断(或return)语句,否则,例如,子级将同时执行子级代码和父级代码。您的案例中没有break语句,因此每个案例都会进入下一个案例。具有pid==0的子进程将

父母重复两次。为什么呢? 此外,父母是如何从孩子那里得到
2
?孩子的
a
b
有自己的虚拟内存,那么我们如何将结果传递给家长呢? 我很困惑


进一步调查
当我将
return 0
插入
案例0
时,它不会重复。看起来switch语句仍在继续。我是否遗漏了switch语句的某些内容?

在C中,switch语句在缺省情况下是通过case实现的;你必须把一个
中断
(或
return
)语句,否则,例如,子级将同时执行子级代码和父级代码。

您的案例中没有
break
语句,因此每个案例都会进入下一个案例。具有
pid==0
的子进程将同时执行0和默认案例块。

As fork将两个pid的一个返回给父进程,另一个返回给子进程,对于父进程,它将返回>0
pid
,对于子进程,将0返回为pid。因此,执行0的case,但不存在中断,因此也会执行默认值,因为在没有中断语句的情况下,switch case会失效……

switch statement会失效;)啊对。我完全震惊了。我很长时间没用这个开关了。谢谢我一分钟前也发现了。这就是为什么我得到了
2
。你认为你的答案对已经给出的答案有什么补充?为什么这个格式如此奇怪?
#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.