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从孩子那里得到的?Child 有自己的虚拟内存ab那么我们如何将结果传递给 parent 呢?我很困惑。


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

4

3 回答 3

9

在 C 语言中,switch 语句默认通过 case;您必须在每个案例的末尾放置一个break;(或)语句,否则,例如,子代码将同时执行子代码和父代码。return

于 2012-09-18T03:10:29.130 回答
6

您的案例中没有任何break陈述,因此每个案例都属于下一个案例。带有 的孩子pid == 0将执行0default case 块。

于 2012-09-18T03:10:30.657 回答
0

由于 fork 将两个 pid 的一个返回给父进程,另一个返回给子进程,因此对于父进程,它返回 > 0 pid,对于子进程,它返回 0 作为 pid。因此 case for 0 被执行,但no break默认情况下也被执行,因为在没有 break 语句的情况下 switch case 失败......

于 2012-09-18T05:57:07.503 回答