2015-09-24 60 views
0

我現在有寫這創造儘可能多的派生進程作爲用戶想要的東西,然後等待它們全部完成,讓他們返回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等。

感覺就像隨機線路被忽略。

如何修復我的代碼以返回適當的隨機值?

回答

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; 
    } 
+0

返回給父級的實際退出狀態是一個8位數字。根據您選擇顯示評估者的方式 - 它不能大於uint8_t - > 255的最大值。 –

相關問題