我已经多次分叉一个过程来生育n个孩子。在分叉之后,在某些时候,我需要在每个子进程中生成一个随机数,所以我写了一个语句来这样做。但在我继续之前,我希望看到每个孩子在终端上生成的随机数。当我写printf()时,我只得到一个输出,我相信是父进程生成的随机数。有人可以帮助我如何让所有子进程打印变量rnd_number在其地址空间中保存的值吗?
此外,由于每个孩子都会执行调用它们来打印rnd_number值的语句,我想知道是什么原因导致它们无法在终端上打印。如果我正在混淆一些概念,我请求有人帮助我。
答案 0 :(得分:0)
你必须在父亲等待每个孩子完成。如果它在孩子面前完成,孩子们就不会打印任何东西。
关于printf,不要忘记这个函数缓冲数据,要小心使用'\ n'来强制printf的flush。 要知道哪个孩子随机获得了什么,你想使用getpid()函数打印它的pid。
pid = fork();
switch (pid)
{
case '0' : // Son
srand(time(NULL)); // having one srand per process sounds better than doing it in the father
int r = rand() % X; // put your randomizer here
printf("Getting %d from %d \n", r, getpid());
return r; //sending to father rand value
case -1 : //Error
perror("fork");
exit(1);
default : //father
int status;
wait(&status);
printf("retriving %d from %d",WEXITSTATUS(status), pid );
}
这是单个进程的代码,但你明白了。您只需要为多进程程序使用相同的方式。