我一直在谷歌搜索我的问题2天,但我完成了它。我有关于进程管理,fork等的非常基本的信息。我被告知要创建一个相同父进程的子进程,并使用管道发送它们的种子,这样它们就可以生成一些随机数,这些都是为了自己的。但我一直坚持创建儿童流程。
for (i = 0; i < NUM_PLAYERS; i++) {
/* TODO: spawn the processes that simulate the players */
switch(pid = fork()){
case -1: // ERROR
exit(EXIT_FAILURE);
case 0: // CHILD PROCESS
printf("My parent id is %d \n", getppid());
exit(EXIT_SUCCESS);
default: // PARENT PROCESS
wait(NULL);
}
}
当我使用这段代码时,父级会创建NUM_PLAYERS
个孩子,但我似乎无法在另一个for循环中使用它们,因为它们已经在案例0的末尾终止了。当我只删除{{1行,创建了很多进程,它们拥有所有不同的父进程。所以我的问题是,如何正确创建子进程并在以后使用它们?
答案 0 :(得分:3)
如果删除exit(EXIT_SUCCESS)
,您的孩子将继续执行分叉的位置,IE将返回for()
循环的近大括号,并自行生成新的子项。你想让孩子做什么?您应该这样做,然后执行exit(EXIT_SUCCESS)
并且不要让它返回for()
循环。
另请注意,wait()
只会等待一个进程退出。
答案 1 :(得分:2)
void do_something()
{
//create random numbers or whatnot
}
// ...........
case 0: // CHILD PROCESS
printf("My parent id is %d \n", getppid());
do_something();
exit(EXIT_SUCCESS);
在稍后的循环中,您需要父项wait
的子项。您拥有它的方式将阻止,直到一个孩子返回。您希望在wait
之前创建多个子项。
请注意,您仍然需要添加管道逻辑,以便父/子可以进行通信。
修改强>
这是您需要做的大致概述:
for (i = 0; i < NUM_PLAYERS; i++) {
/* TODO: spawn the processes that simulate the players */
switch(pid = fork()){
case -1: // ERROR
exit(EXIT_FAILURE);
case 0: // CHILD PROCESS
printf("My parent id is %d \n", getppid());
exit(EXIT_SUCCESS);
}
}
// only the parent will ever execute below here
for (i = 0; i < NUM_PLAYERS; i++)
{
while ( /* read each child's pipe*/)
{
//do something with data
}
}
for (i = 0; i < NUM_PLAYERS; i++)
wait(NULL);
return(0);