0

プロセス用に3つの子を作成するプログラムを作成しました。次に、各子も3つのプロセスを作成します。

これはコードです:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <stdbool.h>
#define GENERACIONES 2

void crearHijo(int, int);

int main()
{
    int i;

    for (i = 1; i <= 3; i++)
        crearHijo(i, 1);

    return 0;
}

void crearHijo(int hijoNum, int gen)
{
    pid_t pid = fork();
    int i, hijos = 3;

    if (pid < 0)
    {
        fprintf(stderr, "Fork Failed");
        exit(-1);                       
    }
    else if (pid == 0)
    {
        printf("Soy de la generación %d, hijo # %d, PID: %d, PPID: %d\n",
                 gen, hijoNum, getpid(), getppid());

        if (gen < GENERACIONES)
        {
            gen++;
            /*srand(time(NULL));
            hijos = rand() % 3 + 1;*/

            for (i = 1; i <= hijos; i++)
                crearHijo(i, gen);
        }

        exit(0);
    }
    else
        waitpid(pid, NULL, NULL);
}

私は3人の息子と9人の孫を期待しています。しかし、次の出力が得られます。

Soy de la generación 1, hijo # 1, PID: 2533, PPID: 2532
Soy de la generación 2, hijo # 1, PID: 2534, PPID: 2533
Soy de la generación 1, hijo # 1, PID: 2533, PPID: 2532
Soy de la generación 2, hijo # 2, PID: 2535, PPID: 2533
Soy de la generación 1, hijo # 1, PID: 2533, PPID: 2532
Soy de la generación 2, hijo # 3, PID: 2536, PPID: 2533
Soy de la generación 1, hijo # 1, PID: 2533, PPID: 2532
Soy de la generación 1, hijo # 2, PID: 2537, PPID: 2532
Soy de la generación 2, hijo # 1, PID: 2538, PPID: 2537
Soy de la generación 1, hijo # 2, PID: 2537, PPID: 2532
Soy de la generación 2, hijo # 2, PID: 2539, PPID: 2537
Soy de la generación 1, hijo # 2, PID: 2537, PPID: 2532
Soy de la generación 2, hijo # 3, PID: 2540, PPID: 2537
Soy de la generación 1, hijo # 2, PID: 2537, PPID: 2532
Soy de la generación 1, hijo # 3, PID: 2541, PPID: 2532
Soy de la generación 2, hijo # 1, PID: 2542, PPID: 2541
Soy de la generación 1, hijo # 3, PID: 2541, PPID: 2532
Soy de la generación 2, hijo # 2, PID: 2543, PPID: 2541
Soy de la generación 1, hijo # 3, PID: 2541, PPID: 2532
Soy de la generación 2, hijo # 3, PID: 2544, PPID: 2541
Soy de la generación 1, hijo # 3, PID: 2541, PPID: 2532

一部のエントリが重複していて、その理由がわかりません。プロセスは12個以下ですが、一部のプロセスは出力を数回出力します。この動作を回避するにはどうすればよいですか?

TIA

4

1 に答える 1

3

いつ:

waitpid(pid, NULL, NULL);

子プロセスで実行され、関数が返され、メインの

for (i = 1; i <= 3; i++)

続く

次のようなものを試してください。

    int main()
{
    int i;
    bool j = true;

    for (i = 1; i <= 3; i++)
    {
       if (j == true)
        j = crearHijo(i, 1);
    }

    return 0;
}

bool crearHijo(int hijoNum, int gen)
{
    pid_t pid = fork();
    int i, hijos = 3;

    if (pid < 0)
    {
        fprintf(stderr, "Fork Failed");
        exit(-1);                       
    }
    else if (pid == 0)
    {
        printf("Soy de la generación %d, hijo # %d, PID: %d, PPID: %d\n",
                 gen, hijoNum, getpid(), getppid());

        if (gen < GENERACIONES)
        {
            gen++;
            /*srand(time(NULL));
            hijos = rand() % 3 + 1;*/

            for (i = 1; i <= hijos; i++)
                crearHijo(i, gen);
        }

        exit(0);
    }
    else
    {
        waitpid(pid, NULL, NULL);
        return (false);
    }
 return (true);
}
于 2012-10-17T15:21:06.773 に答える