2009-09-04 11 views
6

你怎麼這樣,你可以生成10個進程,讓他們做一個小任務並行的方式使用fork()的命令。多fork()的併發

併發是最關鍵的詞,很多地方顯示如何使用叉只使用一個調用fork()在他們的演示。我以爲你會使用某種for循環,但我嘗試過,似乎在我的測試中,fork()產生了一個新進程,做了工作,然後產生了一個新進程。所以它們似乎是按順序運行的,但是如何才能同時進行分叉操作並讓10個進程同時進行工作?

謝謝。

更新:感謝您的答案,我想我剛剛誤解了fork()的某些方面,但現在我明白了。乾杯。

+2

BTW--你真的* *要處理(如文本)或線程(在你的標記)。如果進程需要的標籤是[多] – dmckee 2009-09-04 19:32:56

+0

是的,你是正確的 – 2009-09-04 19:49:15

回答

15

呼叫fork()在一個循環:

添加代碼等待每個評論的孩子:

int numberOfChildren = 10; 
pid_t *childPids = NULL; 
pid_t p; 

/* Allocate array of child PIDs: error handling omitted for brevity */ 
childPids = malloc(numberOfChildren * sizeof(pid_t)); 

/* Start up children */ 
for (int ii = 0; ii < numberOfChildren; ++ii) { 
    if ((p = fork()) == 0) { 
     // Child process: do your work here 
     exit(0); 
    } 
    else { 
     childPids[ii] = p; 
    } 
} 

/* Wait for children to exit */ 
int stillWaiting; 
do { 
    stillWaiting = 0; 
    for (int ii = 0; ii < numberOfChildren; ++ii) { 
     if (childPids[ii] > 0) { 
      if (waitpid(childPids[ii], NULL, WNOHANG) != 0) { 
      /* Child is done */ 
      childPids[ii] = 0; 
      } 
      else { 
      /* Still waiting on this child */ 
      stillWaiting = 1; 
      } 
     } 
     /* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */ 
     sleep(0); 
    } 
} while (stillWaiting); 

/* Cleanup */ 
free(childPids); 
+1

我會寫'破 - > exit' – 2009-09-04 19:37:38

+2

哦最肯定。否則,您會邀請有限的叉形炸彈。 – 2009-09-04 19:43:20

+0

感謝您的發現。我已更新。 – 2009-09-04 19:54:14

3

在「主」過程中產卵相繼與每個孩子剛回路分配一個特定的任務。

4

當你分離進程時,將同時運行。但請注意,除非你有足夠的可用空閒的處理器,他們可能不會真的被同時執行,這不應該真正的問題...

你的第二個段落使它看起來就像你根本不瞭解如何叉的作品,你有檢查返回碼以查看您是在父級還是在分叉進程中。所以你應該讓父母運行一個循環來分離10個進程,並且在你的孩子中你可以做任何你想要做的事情。