2014-10-08 39 views
1

我已经分了一个进程n次有n个孩子。分叉后,在某个时候,我需要在每个子进程中生成一个随机数,所以我写了一个声明来这样做。但在继续之前,我希望看到每个孩子在终端上生成的随机数。当我写printf()时,我只得到一个输出,我相信它是父代产生的随机数。有人可以帮助我如何让所有子进程打印变量rnd_number在其地址空间中保存的值吗?打印每个子进程生成的值c

此外,由于每个孩子都会执行声明,要求他们打印他们的rnd_number值,所以我不知道是什么让他们不能在终端上打印。如果我混合了一些概念,我请求有人帮助我。

回答

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); 
} 

这就是单个进程的代码,但你明白了。你只需要为你的多进程程序使用相同的方式。

+0

感谢您的回复。但是,我需要这样做: 'for(i = 0; i user4102404 2014-10-09 04:16:47

+0

您可以使用waitpid();并在每个放置在阵列上的pid上循环。这帮助你吗? – Mekap 2014-10-10 05:33:04

+0

不幸的是,它并没有帮助。即使我等待孩子们的pid,printf似乎也不会在控制台上输出数据。为了确保缓冲区被刷新,我也使用了fflush()。 printf最终打印变量的本地值,而不是由子进程计算的值。 – user4102404 2014-10-10 08:43:44