4

我们需要告诉以下 C 程序的结果:

main()
{
    int pid, k, som;
    som = 0; k = 2;
    pid = fork();
    if(pid == 0)
        k=5;
    else
        wait(0);
    for(int i = 1; i <= k; i++)
        som += i;
    printf("%d", som);
}

我的第一个期望是 3。当进行 fork 调用时,进程的内存被复制,两个程序都开始运行。子进程然后执行,但k仍然等于2。所以最后它执行1 + 2 = 3;

但是当这个程序被执行时,它会输出 153。我没有得到最近的线索为什么它会输出那个。

谁能告诉我为什么?

4

4 回答 4

15

原因是您有 2 个进程打印到同一个控制台。"fork" 是一个 unix/linux 命令,被调用一次并返回两次。返回之一将在调用 fork 的原始进程中,并将返回生成的子进程的 PID。第二个返回值为 0,这表明它是子进程。

其中一个程序,我相信的孩子,首先执行并计算 15 作为值并最后将其打印到控制台。由于 wait(0),父程序第二次执行并产生值 3。

于 2009-06-18T20:06:40.167 回答
4

15由孩子和3父母打印。

于 2009-06-18T20:09:02.610 回答
2

A 是父母,B 是孩子,这是重要的几行:

A: pid = fork(); // returns 0 for the child process
A: wait(0);
B: k = 5;
B: for(int i = 1; i <= k; i++) som += i; // som = 15
B: printf("%d", som); // prints 15, B finishes, goes back to A
A: for(int i = 1; i <= k; i++) som += i; // som = 3
A: printf("%d", som); // prints 3
于 2009-06-18T20:11:07.333 回答
0

值之间没有打印换行符,因此父母的答案出现在孩子的答案之后。

贾里德关于价值观的原因是正确的。

于 2009-06-18T20:10:52.310 回答