一个小C程序的结果

时间:2009-06-18 20:04:18

标签: c unix fork

我们需要告诉以下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 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:4)

15由儿童打印,3由父母打印。

答案 2 :(得分: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

答案 3 :(得分:0)

在值之间没有打印换行符,所以父母的答案就会在孩子回答后出现。

Jared对价值观的原因是正确的。