分叉'无限'孩子们在循环中

时间:2014-11-01 18:17:06

标签: c unix fork

我在使用一个简单的循环fork()程序时遇到了一些问题,我正在尝试制作,我需要一些帮助。

事情是:我想要一个父亲和三个孩子。每个孩子等待1到10之间的随机时间,然后打印他们的PID。之后他们死了,但是他们会立即替换为其他孩子做同样的事情,所以最后总会有三个孩子在屏幕上打印他们的PID。父亲每3秒打印一次孩子的数量。

这就是我想要的,但程序运行不正常。我知道我做错了什么?

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <errno.h>
#include <time.h>
#include <stdlib.h>
#include <sys/wait.h>


int numero_procesos_hijos = 0;

void manejador_SIGCHLD(int sig)
{
    pid_t pid_hijo;
    int e;

    do {
        pid_hijo = wait3(&e, WNOHANG, NULL);
        if ((pid_hijo > (pid_t)0) && (WIFEXITED(e) || WIFSIGNALED(e)))
            numero_procesos_hijos--;
    } while (pid_hijo > (pid_t)0);
}

int main(void)
{
    pid_t pid_hijo; 

    srand(time(NULL));
    fflush(NULL);

    if (signal(SIGCHLD, manejador_SIGCHLD) == SIG_ERR){
        perror("error en signal");
        exit(1);
    }

    do{
        if (numero_procesos_hijos < 3)
        {
            pid_hijo = fork();
            if (pid_hijo == -1){
                perror("Error en la creacion del fork");
                exit(1);
            }
            if (pid_hijo == 0){ /* Hijo */
                sleep(rand() % 10 + 1);
                printf("Soy el hijo con el PID %d\n", getpid());
            }

            numero_procesos_hijos++;
        }
        if (pid_hijo > 0){ /* Padre */
            sleep(3);
            printf("Numero procesos hijos: %d\n", numero_procesos_hijos);
        }
    } while (1);
}

0 个答案:

没有答案