考虑下面的代码,程序在for循环中的fork()之后开始执行?我无法理解输出。
#include <stdio.h>
#include <sys/types.h>
int parent_code() {
printf("[%d] Parent\n",getpid());
}
int child_code() {
printf("[%d] Child\n",getpid());
}
int main() {
int i;
pid_t pid;
for(i=0;i<4;i++) {
pid = fork();
if(pid == 0) {
child_code();
} else {
parent_code();
waitpid(pid,&i,0);
}
}
}
输出:
[4896] Parent
[4897] Child
[4897] Parent
[4898] Child
[4898] Parent
[4899] Child
[4899] Parent
[4900] Child
[4898] Parent
[4901] Child
[4897] Parent
[4902] Child
[4902] Parent
[4903] Child
[4897] Parent
[4904] Child
[4896] Parent
[4905] Child
[4905] Parent
[4906] Child
[4906] Parent
[4907] Child
[4905] Parent
[4908] Child
[4896] Parent
[4909] Child
[4909] Parent
[4910] Child
[4896] Parent
[4911] Child
子程序从哪里开始执行?
如果从顶部开始,是否会有叉炸弹(孩子再次调用叉子)?所以在这个程序中,我期望子进程从if(pid == 0) {
的行开始执行,我只想要一个父进程和4个子进程。我在哪里做错了?
答案 0 :(得分:2)
理解fork
系统调用的一种简单方法是将其视为返回两次的函数。它在父级中返回一次,就像普通函数一样,在新进程中再次返回。
这两个进程在fork
“返回”的地方继续。
我只想要一个父进程和4个子进程。我哪去了 做错了
想想第一个子进程。它会调用child_code()
然后它自己分叉。如果他们可以通过循环,孩子们也会分叉。防止这种情况的一种简单方法是在break
之后调用child_code
。
答案 1 :(得分:1)
你基本上是在做一棵树 最多2的示例:
Process
0 Parent Parent
1 Child Parent
2 Child
3 Child Parent
4 Child