2014-10-08 40 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