你如何干净利落地获得一个父进程来创建多个孩子,每个孩子都必须自己做。孩子们还必须使用未命名的管道与父母沟通,所以我不认为execv可以在这里使用。
我有这样的事情:
int main (int argc, const char * argv[])
{
pid_t pids[2];
int i;
for (i = 0; i < 2; ++i) {
if ((pids[i] = fork()) < 0) {
fprintf(stderr, "Error. Couldn't fork\n");
exit(EXIT_FAILURE);
} else if (pids[i] == 0) { // child
if (i == 0) {
readerChild();
} else {
writerChild();
}
}
}
//parent stuff;
for (i = 0; i < 2; ++i) {
wait(NULL);
}
return 0;
}
但是根据我的输出,当我只想要一个时,会创建两个作家孩子。
答案 0 :(得分:2)
请记住,当您fork()
时,父母和子女都会以相同的状态启动(fork()
的返回值除外)。因此,孩子也将执行你的外部for
循环,并产生自己的孩子(见下图)。您需要更改控制流程以考虑到这一点。
P --> fork --> fork --> wait
| --> writerChild -- wait
|
--> readerChild --> fork --> wait
--> writerChild --> wait
答案 1 :(得分:1)
这是您的代码中发生的事情:
父母分叉。我仍然是0,所以这个孩子会调用readerChild()。父和子继续循环的第二次迭代。他们又两次分叉了。这样你就会得到2个作家的孩子其中一个是孩子,一个是孙子。
在您的子部分结束时,您需要阻止它循环。放一个break;
答案 2 :(得分:0)
我个人每个孩子只写一个函数...除非readerChild()/ writerChild()阻塞线程并退出,readerChild将生成一个新的writerChild,因为它仍将在该循环的上下文中执行。