我正在尝试编写一个从单个父进程分发进程的小程序。目前我的代码执行了几次,但是孩子们创建了更多的子进程,我想要消除它们。
int main() {
pid_t c;
for (int i = 0; i < 5; i++) {
c = fork();
if(c < 0) {
perror("fork");
exit(1);
}
else if( c > 0 ) {
printf("parentID = %d, childID = %d\n", getppid(i), getpid(i));
}
}
}
我不知道如何修改它,以便fork只是从父级分叉。
编辑:感谢您的帮助,得到了解决方案:int main() {
pid_t c;
for (int i = 0; i < 5; i++) {
c = fork();
if(c < 0) {
perror("fork");
exit(1);
}
else if( c > 0 ) {
printf("parentID = %d, childID = %d\n", getppid(i), getpid(i));
}
else {
exit(0);
}
}
}
答案 0 :(得分:0)
子进程不会进入if
块的任何部分,只是循环回到for
循环的顶部,从而创建更多子进程。此外,if (n > 0)
块将为父项而不是子项运行,因为fork
将0返回父项,子项的pid返回父项。
将if (n > 0)
更改为(n == 0)
,并在块的底部调用exit()
以防止孩子继续。另外,getpid()
和getppid()
不接受任何争论。
int main() {
pid_t c;
for (int i = 0; i < 5; i++) {
c = fork();
if(c < 0) {
perror("fork");
exit(1);
}
else if( c == 0 ) {
printf("parentID = %d, childID = %d\n", getppid(), getpid());
exit(0); // <-- here
}
}
}
答案 1 :(得分:0)
发布的代码中没有任何内容识别孩子(0 == pid)
所以如果儿童击中(并跳过)这两个孩子的话。声明。
点击循环结束,
分支回到循环的顶部,调用fork()....等。
建议:添加
elseif( 0 == pid )
{ // then child ...
exit( EXIT_SUCCESS );
}