2010-11-24 90 views
0

使用它,我寫了下面的代碼,但最後printf進行sumofall返回0?我怎樣才能sumoro,sumort和sumorth的值從孩子得到孩子值在父母

代碼:

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <stdlib.h> 
int main() 
{ 
    int array[3][3]; 
    int sumoro = 0,sumort = 0,sumorth = 0; 

    pid_t pid = fork(); 

if (pid < 0) { 
    printf("fork faild"); 
    exit(1); 
} 
else { 

    if (pid == 0) 
    { 
     for (int i = 0; i < 3 ; i++) { 
      for (int j = 0; j < 3; j++) { 
       array[i][j] = rand()%9; 
       if (i == 0) 
       sumoro += array[0][j]; 
       if (i == 1) 
       sumort += array[1][j]; 
       if (i == 2) 
       sumorth += array[2][j]; 
      } 
     } 
    } 
    else { 
     waitpid(pid, NULL, 0); 
     int sumofall = sumoro + sumort + sumorth; 
     printf("sum of all equal : %d ", sumofall); 
    } 


return 0; 

    } 
} 

注:不一定,但如果你能幫助我,我怎樣才能使蘭特()給出每次新的數字,因爲我相同的價值觀

回答

1

當你叉,每個進程駐留在自己的空間後。沒有簡單的方法來回移動數據 - 至少沒有像讀取變量那樣簡單的方法。您需要使用某種進程間通信(IPC)方法,例如匿名管道(請參閱管道(2)手冊頁)。

至於rand(),您需要爲隨機數生成器生成一個相對隨機的值。一個簡單的解決方案,幾乎任何東西,但密碼學的足夠的隨機性發布一次在您的程序開始:

srand(time(NULL));

每次運行程序時,都會使用時鐘爲RNG賦予不同的值,除非您設法以相同的秒數運行兩次。

+0

謝謝你我使用了共享內存#include #include 2個指針先在父親的第二個孩子 – 2010-11-24 19:58:35

1

基本上部分在其中添加了自己的價值觀,並在那裏你會注意到每一次打印它們在不同的過程中。

對於rand(),你需要做的是用一個種子初始化它,默認情況下它被接種爲0,這就是爲什麼它總是給你相同的序列(你怎麼看待rand給你的值?) 。什麼是通常做的是與時間/日期的種子,以便它總是不同的,請嘗試使用

srand (time(NULL)); 

爲確保#include <time.h>