从子级获取值以在父级中使用它

时间:2010-11-24 17:21:16

标签: c linux fork

我写了下面的代码,但是最后一个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;

    }
}

注意:不一定,但如果你可以帮助我,我怎样才能使rand()每次给出新数字,因为我每次都注意到相同的值

2 个答案:

答案 0 :(得分:1)

基本上,您添加值以及打印位置的部分位于不同的过程中。

对于rand(),您需要做的是使用种子初始化它,默认情况下它是0,这就是为什么它总是给你相同的序列(你怎么看到rand给你的值?)。通常做的是用时间/日期对其进行播种,使其始终不同,尝试使用

srand ( time(NULL) );

确保#include <time.h>

答案 1 :(得分:1)

当您进行分叉时,每个进程随后都会驻留在自己的空间中。没有简单的方法来回移动数据 - 至少没有什么比读取变量简单。您需要使用某种进程间通信(IPC)方法,例如匿名管道(请参阅管道(2)手册页)。

对于rand(),您需要使用相对随机的值为随机数生成器播种。一个简单的解决方案具有足够的随机性,除了加密之外几乎任何东西都是在程序开头发出一次的语句:

函数srand(时间(NULL));

每次运行程序时,这会使用时钟为RNG播种不同的值,除非你设法以相同的秒数运行它两次。