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

C 为什么我的分叉进程没有返回我想要返回的值?,c,unix,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 = &v

目前,我必须编写一个程序,根据用户的需要创建尽可能多的分叉进程,然后等待所有进程完成,让它们返回一个介于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;
}
#包括
#包括
#包括
int main(){
int n,i;
int*返回值,值;
int-pid;
国际等待ID;
returnvalue=&value;
printf(“要启动多少进程?\n”);
scanf(“%d”和“&n”);
对于(i=0;i0){
waitingID=waitpid(pid,返回值,0);
printf(“%d的返回值为:%d\n”,waitingID,*returnvalue);
打破
}
否则{
printf(“出现问题”);
}
}
srand(时间(空));
退出((rand()%6)+1);
返回0;
}
到目前为止,它基本上是有效的,但我从来没有得到一个介于1和6之间的数字,而是一些值,比如768、512、256等等

感觉就像是随机线被忽略了

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

通过第二个参数返回的值
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;
    }
else if(pid>0){
waitingID=waitpid(pid,返回值,0);
if(waitingID<0){
perror(“等待子进程时”);
}else if(waitingId==0){
printf(“wait()意外返回0\n”);
}else if(WIFEXITED(*returnValue)){
printf(“进程%d已退出,代码:%u\n”,等待ID,
WEXITSTATUS(*returnvalue));
}否则{
printf(“进程%d已停止或继续”,waitingID);
}
打破
}
通过第二个参数返回的值
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;
    }
else if(pid>0){
waitingID=waitpid(pid,返回值,0);
if(waitingID<0){
perror(“等待子进程时”);
}else if(waitingId==0){
printf(“wait()意外返回0\n”);
}else if(WIFEXITED(*returnValue)){
printf(“进程%d已退出,代码:%u\n”,等待ID,
WEXITSTATUS(*returnvalue));
}否则{
printf(“进程%d已停止或继续”,waitingID);
}
打破
}
通过第二个参数返回的值
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;
    }
else if(pid>0){
waitingID=waitpid(pid,返回值,0);
if(waitingID<0){
perror(“等待子进程时”);
}else if(waitingId==0){
printf(“wait()意外返回0\n”);
}else if(WIFEXITED(*returnValue)){
printf(“进程%d已退出,代码:%u\n”,等待ID,
WEXITSTATUS(*returnvalue));
}否则{
printf(“进程%d已停止或继续”,waitingID);
}
打破
}
通过第二个参数返回的值
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;
    }
else if(pid>0){
waitingID=waitpid(pid,返回值,0);
if(waitingID<0){
perror(“等待子进程时”);
}else if(waitingId==0){
printf(“wait()意外返回0\n”);
}else if(WIFEXITED(*returnValue)){
printf(“进程%d已退出,代码:%u\n”,等待ID,
WEXITSTATUS(*returnvalue));
}否则{
printf(“进程%d已停止或继续”,waitingID);
}
打破
}
实际退出状态返回