【发布时间】:2015-01-26 18:00:14
【问题描述】:
我正在尝试从同一个父级创建多个进程,但它总是以比预期更多的进程结束。我不知道该怎么做,在这里需要一些帮助。
我在网上找了一段代码,试了一下,
int main ()
{
pid_t pid=0;
int i=0;
for (i=0; i<3; i++)
{
pid=fork();
switch(pid)
{
case 0:
{
cout<<"\nI am a child and my pid is:"<<getpid();
cout<<endl;
exit(0);
break;
}
default:
{
cout<<"\nI am a parent and my pid is: "<<getpid();
cout<<"\nMy child pid is: "<<pid;
cout<<endl;
wait(NULL);
break;
}
}
}
return 0;
}
此代码确实有效,并从同一父级创建了 3 个子级。但是,这似乎是因为在创建每个子进程后,它立即被终止。所以它不会在下一轮 for 循环中分叉更多的孙子进程。但是我需要让这些子进程运行一段时间,并且他们需要与父母沟通。
【问题讨论】:
-
它是否产生输出“我是个孩子......”?一旦您调用 exit,该过程就会结束。他们结束得如此之快的原因是你在这个过程中没有做任何事情。您应该调用一些 CPU 密集型函数,而不是打印并立即退出。
-
这不是fork的问题,而是简单的逻辑问题。
fork()在子节点中返回 0。在纸上追踪这里发生的事情,没有孩子的exit,循环再次运行,fork再次执行。你想要做的是如果进程是孩子,你走出循环,否则你继续循环和分叉...... -
感谢两位回答我的问题。我通过使用 if..else 而不是 case..switch 修改了我的代码,并在分叉子进程的末尾添加了一个 break 以退出循环,它可以工作!!!!!!我得到了我想要的!
-
不要在儿童中打电话给
exit。这会导致atexit任务(例如刷新缓冲区)不止一次发生。使用_exit。 -
我不知道你到底在问什么。您的代码实现了标题中的目标。在正文的最后,你陈述你真正想做的事情。但是你不会问任何关于如何做到这一点的问题。所以你会得到愚蠢的回答,比如“编写你需要的代码,如果遇到麻烦,请寻求帮助”。