2013-12-09 44 views
1

我試圖做一個叉運行在一個文件的exec,然後等待它完成。如果子進程中的exec由我要打印信號的信號終止,如果程序運行時間過長,我想打印超時。waitpid不工作 - 默認錯誤

 pid_t pid; 
     pid = fork(); 

     if(pid == 0) { 
      //child process 
     } 
     else { 
      alarm(timeout); 
      int status; 
      if(wait(pid, &status, 0) == pid) { 
       alarm(0); 
       fpw = fopen(testreport, "a+"); 
       if(WIFSIGNALED(status)) { 
        fprintf(fpw, "Run time errors: signal %d\n", WTERMSIG(status); 
       } 
       else { 
        fprintf(fpw, "Run time errors: none"); 
       } 
       fclose(fpw); 
      } 
      else { 
       alarm(0); 
       kill(pid, SIGTERM); 
       fpw = fopen(testreport, "a+"); 
       fprintf(fpw, "Run time errors: timeout\n"); 
       fclose(fpw); 
      } 
     } 

Testreport是一個先前聲明的char *文件名。 waitpid不工作。當我打印waitpid和errno的值時,分別得到-1和14。我查了一下errno 14,它是一個EFAULT,它表明狀態地址是無效的。這怎麼可能呢?

回答

0

建議:

  1. -Wall添加到您的gcc參數。

  2. 更多錯誤檢查。 在你的代碼中,fork()可能返回-1,-1是waitpid的有效輸入,這可能是由於行爲不同所致。

1

這個問題可能這一行:

 if(wait(pid, &status, 0) == pid) { 

在這裏,你在呼喚wait()它僅採用一個參數。看起來你打算打電話waitpid(),這需要三個參數(同樣,在你問的題目中你問的是waitpid())。如果您用三個參數調用wait(),那麼結果可能是不可預測的,並且肯定會導致您觀察到的問題。