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>