2013-07-02 149 views
1

我和這個小程序的一個問題:計數器增加()

int main() { 

    pid_t process; 
    int count= 0; 

    switch(process= fork()) { 

    case -1: 
     printf("Fork error!\n\n"); 
     exit(1); 
    break; 

    case 0: //child 
     printf("Process CHILD: PID= %d, Value= %d \n", getpid(), process); 
     printf("Coounter NOT increased: %d\n", count); 
     printf("Increase counter...\n"); 
     sleep(2); 
     count= count + 2; 
     printf("Counter increased: %d\n\n", count); 
     exit(0); 
    break; 

    default: //parent 
     wait(0); 
     printf("Process PARENT: PID= %d, Value= %d\n", getpid(), process); 
     printf("Counter value: %d\n\n", count); 
    break; 
    } 
    return 0; 
} 

我增加計數器的孩子,但在父計數沒有增加,爲什麼?

謝謝大家

回答

2

當你做對叉它會創建一個新的子進程。新的子進程擁有自己的內存,堆棧,本地/全局變量空間。

兩個過程從那裏叉callled同一點開始執行,但具有不同的存儲空間。所以一個進程的內存變化不會反映在其他進程中。

,如果你想用兩個進程之間相同的內存,你可以使用的情況下,共享內存。

另一種方法是你可以從子進程的變量值重定向到標準輸出流,並從父進程讀取它。

4

因爲父母和孩子都沒有在同一個進程中運行。

用於可變的存儲器是在每個過程中的不同。順便說一下,這是過程的要點。

如果您真的想在進程或線程中執行此操作,只需要在單個進程的內存中進行多處理,請查看「shared memory」。

6

這是因爲在fork之後,父進程和子進程是不同的進程,並且它們每個都有自己的變量副本count

3

因爲當你fork時,過程映像被複制。與線程不同,修改全局變量的一個進程不會影響其他進程。這實際上是在許多情況下使用多個進程的好處之一。實際上,可以使用寫入時複製來消除實際的複製,但是當您在子中增加計數器時,必須進行復制,以便父代不會看到它。

0
#include <stdio.h> 
#include <stdlib.h> 

int count= 0; 

int main() { 

    pid_t process; 


    switch(process= fork()) { 

    case -1: 
     printf("Fork error!\n\n"); 
     exit(1); 
    break; 

    case 0: //child 
     printf("Process CHILD: PID= %d, Value= %d \n", getpid(), process); 
     printf("Coounter NOT increased: %d\n", count); 
     printf("Increase counter...\n"); 
     sleep(2); 
     count= count + 2; 
     printf("Counter increased: %d\n\n", count); 
     exit(0); 
    break; 

    default: //parent 
     wait(0); 
     printf("Process PARENT: PID= %d, Value= %d\n", getpid(), process); 
     printf("Counter value: %d\n\n", count); 
    break; 
    } 
    return 0; 
}