2014-04-17 87 views
0

我有以下程序創建特定數目的子進程,說20保持相同數量的子進程

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 

#define NITER 20 

int main() 
{ 
    pid_t pid; 
    int i; 

    printf("\nExemplo de aplicacao 02 da funcao fork()\n"); 
    printf("Processo pai inicial tem PID=%5d\n", (int) getpid()); 
    for(i=1; i<=NITER; i++) { 
     pid= fork(); 
     if (pid==-1) { 
     perror("Erro na funcao fork()"); 
     exit(1); 
     } 
     if (pid) { 
     /* pid>0, codigo para o processo pai */ 
     printf("Codigo do Pai (i=%2d): PID=%5d PPID=%5d\n", \ 
      i, (int) getpid(), (int) getppid()); 
     } 
     else { 
     /* pid=0, codigo para o processo filho */ 
     printf("Codigo do Filho(i=%2d): PID=%5d PPID=%5d\n", \ 
      i, (int) getpid(), (int) getppid()); 
     } 
    } 
    return 0; 
} 

我想改變它,以這樣的方式,我要確保我只有4個子進程同時運行。它需要檢查是否有一個4結束並自動創建一個新的。這直到達到20的數量。任何人都可以幫忙嗎?

回答

1

開始你的4個孩子,然後用wait知道孩子何時退出並重新啓動另一個孩子。


編輯 - (未經測試,但應該給你一些提示):

int main() 
{ 
    pid_t pid; 
    int process_count = 0, global_process_count = 0, max_process_count = 20; 

    while (global_process_count < max_process_count) 
    { 
     while (process_count < 4) 
     { 
      if ((pid = fork()) < 0) 
      { 
       perror("fork"); 
       exit(EXIT_FAILURE); 
      } 
      else if (pid == 0) 
      { 
       // Child process 
       exit(EXIT_SUCESS); 
      } 
      ++process_count; 
      ++global_process_count; 
     } 
     while (waitpid(-1, NULL, WNOHANG) > 0) 
      --process_count; 
    } 
} 
+0

Thks。我不太熟悉等待選項。你可以在代碼中顯示嗎? – user3038679

+0

看我的編輯。沒有測試,但應該給你一些提示。 – Chnossos

+1

+1,但您可能想要waitpid> 0,否則當存在尚未更改狀態的現有子項時,您將繼續遞減process_count。沒有辦法避免持續輪詢waitpid而不進行睡眠或將其更改爲使用信號處理程序。 – Duck

0

使用semaphore,但這正是你正在嘗試做的。還有示例代碼。

Here是關於如何使用信號量的說明。