2009-06-18 19 views
4

,我們需要跟以下C程序的結果:結果一個小的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.當一個叉調用時,該進程的內存被複制,並且兩個程序都運行。子進程然後執行,但k仍然等於2.所以最後,它執行1 + 2 = 3;

但是當這個程序被執行時,它輸出153.我還沒有得到最接近的線索爲什麼它輸出。

任何人都可以說出原因嗎?

回答

15

之所以你有2個進程打印到同一個控制檯。 「fork」是一個被調用一次並返回兩次的unix/linux命令。其中一個返回將在原始進程中調用fork,並將返回生成的子進程的PID。第二個返回值將是0,這表示它是子進程。

其中一個程序是我相信的孩子,首先執行並計算15作爲值並最後將其打印到控制檯。由於等待(0),父程序執行第二次併產生值3.

+0

offcourse。 Totaly忘記了這兩個過程都會產生產出。 – Ikke 2009-06-18 20:08:38

4

15由子代打印,而3由父項打印。

0

這些值之間沒有打印換行符,所以父母的答案出現在孩子的答案之後。

賈裏德對價值的原因是正確的。

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