【问题标题】:Print the values generated by each child process in c打印c中每个子进程生成的值
【发布时间】:2014-12-03 04:23:31
【问题描述】:

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

另外,由于每个孩子都会执行调用他们的语句来打印他们的 rnd_number 值,我想知道是什么让他们没有在终端上打印。如果我混淆了一些概念,我请求有人在这里帮助我。

【问题讨论】:

    标签: c fork


    【解决方案1】:

    您必须在父亲那里等待每个孩子完成。如果它在其子代之前完成,则子代将不会打印任何内容。

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

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

    【讨论】:

    • 感谢您的回复。但是,我需要这样做:for(i = 0; i<n; i++){ pid = fork(); if (pid==0) Do_something(); else if (pid<0) report error; else Do_something_else(); } /*Some logic that all the processes created so far have to execute*/ r = rand()%X; print(r); //I want the print to give me the value of r from each of the processes forked. 如果有帮助,我将创建的每个进程的 PID 存储在一个数组中
    • 你可以使用waitpid();并使用阵列中存储的每个 pid 循环。这对你有帮助吗?
    • 不幸的是它没有帮助。即使我等待孩子的 pid,printf 似乎也不会在控制台上输出数据。为了确保缓冲区被刷新,我也使用了 fflush()。 printf 最终打印出变量的本地值,而不是子进程计算的值。
    • 再次阅读我的代码。您会在孩子身上看到,我返回生成的值,然后将其打印在父亲身上。您是否使用返回值来打印您的值?
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 2018-01-19
    • 1970-01-01
    • 2011-10-29
    • 2018-08-25
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多