gpt4 book ai didi

c - Fork() 父级和子级

转载 作者:行者123 更新时间:2023-11-30 17:35:05 25 4
gpt4 key购买 nike

我需要的是 3 个 child 和 1 个家长(主程序),因为 child 和家长将具有不同的功能。我不知道为什么我不能正确地做到这一点,据我所读,当你执行 fork() 时,如果它返回 0,则执行子代的代码,否则执行父代的代码。所以,这是我的程序:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int
main(int argc, char ** argv) {

printf ("Init Parent. PID =%d\n", getpid());

fork();
fork();
if (fork() == 0) {
printf ("Init Child. PID =%d\n", getpid());
sleep(1);

} else {
printf ("I am the parent. PID = %d\n",getpid());
sleep(1);

}
exit(0);
}

这是输出:

Init Parent. PID =9007
I am the parent. PID = 9007
I am the parent. PID = 9009
Init Child. PID =9010
Init Child. PID =9011
I am the parent. PID = 9008
I am the parent. PID = 9012
Init Child. PID =9013
Init Child. PID =9014

这就是我想要的:

Init Parent. PID =9007
I am the parent. PID = 9007
Init Child. PID =9010
Init Child. PID =9011
Init Child. PID =9013
Init Child. PID =9014

我不知道为什么它说我是家长 3 次以及如何正确地做到这一点,因为 1

if (fork() == 0) 

看起来很糟糕。

我非常感谢您的帮助,提前谢谢您。

最佳答案

您必须从第一次 fork 后开始检查父子关系。 每次调用fork()时,您都会生成一个子进程。您现在正在做的是:

  • 开始执行 1 个程序(+1 个进程,总共 1 个进程)
  • 第一个 fork():主程序生成子程序(+1 个进程,总共 2 个进程)
  • 第二个fork():子程序主程序生成子程序。 (+2 个进程,总共 4 个进程)
  • 第三个fork():前面提到的所有进程生成子进程(+4 个进程,总共 8 个进程)。

原始代码生成的进程树如下所示:

      pi
/ | \
pi pi pi
/ | |
pi pi pi
|
pi

可能的解决方案(适用于n个 child ):

int noProcs = 3;
int i;
for (i = 0; i < noProcs; ++i) {
if (fork() == 0) {
printf("in child\n");
//Do stuff...
exit(0);
}
}
//DONT FORGET: Reap zombies using wait()/waitpid()/SIGCHLD etc...

请注意,每次调用 fork() 后,生成的子进程都会执行相同的后续代码。对于循环迭代中的每个步骤,以下是我使用 fork() 生成子级后发生的情况:

  • 子进程:执行子代码,并调用exit()。这可以防止我们循环并创建比预期更多的子级。
  • 父进程:绕过 if(fork() == 0) 语句主体并逐步执行循环,根据指定生成其他子进程。

关于c - Fork() 父级和子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23115820/

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