2014-04-17 44 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是关于如何使用信号量的说明。