#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为a
和b
提供了自己的虚拟内存,那么我们如何将该结果传输给父级?
我很困惑。
进一步调查
当我将return 0
插入case 0
时,它不会重复。看起来switch语句仍在继续。我错过了关于switch语句的内容吗?
答案 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会掉线....