我需要的是 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/