2011-02-16 95 views
4

我需要創建一定數量的併發子進程。我還希望每個子進程都修改一個全局變量,以便主父進程可以在其最後修改版本中進行打印。當我運行下面的程序時,'k'的最終值將是5,所以全局變量不會改變。如果我刪除「exit(0)」部分,那麼全局變量會改變,但是這次創建的子進程數量會變大。如何使用fork創建一定數量的子進程()

使用fork(),我將如何創建X個可以修改主父進程中的數據(全局變量,局部變量等)的子進程?

int k = 5; // global variable 

int main(){ 

    int i=0; 
    int status; 

    for(i = 0; i<5; i++){ 
    if(fork() == 0){ 
     printf("child %d %d\n", i, ++k); 
     sleep(5); 
     printf("done %d\n",i); 
     exit(0); 
    } 
    } 

    return 0; 
} 
+1

你回答了你自己的問題 - 使用for循環。 – 2011-02-16 17:36:28

回答

1

子進程默認情況下不能改變父進程的地址空間中的任何內容。你需要共享內存,以及一個互斥機制來防止競爭條件。

2

你不能這樣做。 Fork將創建一個新進程,它將複製(或寫入時複製)內存頁到新進程中。這意味着你的每個子進程都會得到他們自己的「k」副本,每個「k」副本只會增加一次。

要讓所有進程回傳給「相同」k變量,您需要執行某種進程間通信。良好的進程間通信的

實例:

  1. 有父進程創建,存儲k的值的共享存儲器段。讓子進程等待獨佔內存段的共享(通過父進程創建的互斥鎖)。當孩子擁有排他鎖時,讓孩子讀取k的值並存儲k + 1的值。

  2. 在父進程和子進程之間創建每個進程管道。讓父母讀取管道中的消息,表明想要增加k。讓父進程代表孩子增加k值。差進程間通信的

實例:

  1. 任何溶液,其未能確保以K變化是原子(意思是兩個爭孩子可能既增量K至相同的值)。這種缺乏照顧會導致K的值似乎增加的次數少於子過程的次數,因爲設定值可能看起來像(2,3,4,5)。這意味着文件I/O幾乎是無用的,除非你創建一個框架來確保原子操作鎖定文件以進行獨佔訪問。
0

子進程得到一個副本的父母地址空間。換句話說,每個子進程都有自己的全局變量副本。

您需要將變量放在共享內存映射中,以允許所有子進程和父進程共享相同的變量。

1

按定義進程無法直接修改其他進程的資源(如全局變量等)。你想要使用線程而不是進程。看看pthread_create(3)或克隆(2)

相關問題