保持相同数量的子进程

时间:2014-04-17 11:30:15

标签: c++ linux

我有以下程序创建一定数量的子进程,比如说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的数量。任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

使用semaphore,它完全符合您的要求。还有示例代码。

Here是有关如何使用信号量的说明。