为什么我的分叉进程没有返回我想要返回的值?

时间:2015-09-24 19:04:13

标签: c unix

我目前必须编写一个程序,根据用户的需要创建尽可能多的分叉进程,然后等待所有这些进程完成并让它们返回1到6之间的随机数。

到目前为止,这是我的代码:

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main(){

  int n,i;
  int *returnvalue, value;
  int pid;
  int waitingID;

  returnvalue = &value;

  printf("How many processes to start?\n");
  scanf("%d",&n);

  for(i=0; i < n; i++){
    pid = fork();
    if(pid==0){
      printf("I am %d, from iteration %d\n",getpid(), i);
    }
    else if(pid > 0){
      waitingID = waitpid(pid, returnvalue, 0);
      printf("Return-value of %d is: %d\n", waitingID, *returnvalue);
      break;
    }
    else{
      printf("A problem occured.");
    }
  }

  srand(time(NULL));
  exit((rand()%6)+1);

  return 0;
}

它实际上基本上工作到目前为止,但我从来没有得到1到6之间的数字,而是一些值,如768,512,256等等。

感觉随机线被忽略了。

如何修复代码以返回正确的随机值?

1 个答案:

答案 0 :(得分:3)

waitpid()通过其第二个参数返回而不是收集进程的退出代码。相反,它是一个包含退出代码的位掩码(如果实际上退出了进程)以及其他几个细节。在wait.h中声明了一组宏,您可以通过它们提取各个部分。

特别是,给定waitpid(pid, returnvalue, 0) > 0,您可以通过测试WIFEXITED(*returnValue)来确定该进程是否已退出(例如,相反,例如,被停止)。如果确实如此,那么您可以获得退出状态WEXITSTATUS(*returnValue)。因此,你可以写

    else if (pid > 0){
      waitingID = waitpid(pid, returnvalue, 0);
      if (waitingID < 0) {
          perror("While waiting on a child process");
      } else if (waitingId == 0) {
          printf("wait() unexpectedly returned 0\n");
      } else if (WIFEXITED(*returnValue)) {
          printf("Process %d exited with code: %u\n", waitingID,
              WEXITSTATUS(*returnvalue));
      } else {
          printf("Process %d was stopped or continued\n", waitingID);
      }
      break;
    }