gpt4 book ai didi

c - 一些子进程多次完成他们的工作

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:01 26 4
gpt4 key购买 nike

我编写了一个程序,为一个进程创建了 3 个子进程。然后,每个 child 也创建 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

最佳答案

当你:

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);
}

关于c - 一些子进程多次完成他们的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12937520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com