我想编写一个创建N
子进程的UNIX程序,以便第一个进程创建一个子进程,然后这个子进程只创建一个子进程,然后子进程创建另一个进程孩子等
这是我的代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int N=3;
int i=0;
printf("Creating %d children\n", N);
printf("PARENT PROCESS\nMy pid is:%d \n",getpid() );
for(i=0;i<N;i++)
{
pid_t pid=fork();
if(pid < 0)
{
perror("Fork error\n");
return 1;
}
else if (pid==0) /* child */
{
printf("CHILD My pid is:%d my parent pid is %d\n",getpid(), getppid() );
}
else /* parrent */
{
exit(0);
}
}
return 0;
}
我期望的输出格式为:
Creating 3 children
PARENT PROCESS
My pid is 1234
CHILD My pid is 4567 my parent pid is 1234
CHILD My pid is 3528 my parent pid is 4567
CHILD My pid is 5735 my parent pid is 3528
我在终端输入的输出是
Creating 3 children
PARENT PROCESS
My pid is:564
CHILD My pid is:5036 my parent pid is 564
User@User-PC ~
$ CHILD My pid is:4804 my parent pid is 1
CHILD My pid is:6412 my parent pid is 4804
问题是程序似乎没有终止。我应该使用Ctrl+C
离开终端,这是不正常的。你能帮我解决这个问题吗?
答案 0 :(得分:3)
当父母去世时,孩子们会死去。 在您的情况下,父项在创建所有子项之前退出。
在退出前尝试等待孩子:
else /* parrent */
{
int returnStatus;
waitpid(pid, &returnStatus, 0); // Parent process waits for child to terminate.
exit(0);
}
答案 1 :(得分:0)
尝试等待进程等待(NULL);
pid_t child = fork();
if (child == -1)
{
puts("error");
exit(0);
}
else if (child == 0)
{
// your action
}
else
{
wait(&child);
exit(0);
}
所以你的父亲会等待子进程退出
答案 2 :(得分:0)
建议的治疗是正确的,但说明的理由是错误的。儿童不与父母一起死亡。这条线
CHILD My pid is:4804 my parent pid is 1
清楚地表明,当孩子叫getppid()
时,其父母已经死亡,并且该孩子已被重新定位为init
(pid 1)。
真正的问题是,在孩子打印完信息后,它会继续执行循环,产生更多孩子,使你的程序成为fork bomb。