我目前必须编写一个程序,根据用户的需要创建尽可能多的分叉进程,然后等待所有这些进程完成并让它们返回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等等。
感觉随机线被忽略了。
如何修复代码以返回正确的随机值?
答案 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;
}