2012-11-23 27 views
1

我有以下代碼。如何獲得fork()中execvp的錯誤?

我的問題是在代碼

 int main() { 

      .... 

     if ((uproc.pid = fork()) == -1) { 
      return -1; 
     } 

     if (uproc.pid == 0) { 
      /* child */ 

      const char *argv[3]; 
      int i = 0; 
      argv[i++] = "/bin/sh"; 
      argv[i++] = "/my/script.sh"; 
      argv[i++] = NULL; 

      execvp(argv[0], (char **) argv); 
      exit(ESRCH); 

     } else if (uproc.pid < 0) 
      return -1; 

     /* parent */ 
     int status; 
     while (wait(&status) != uproc.pid) { 
      DD(DEBUG,"waiting for child to exit"); 
     } 

      // If /my/script.sh exit accidentally in some place with error. 
      // can I catch this error right here? 
      ...... 
    } 
+0

你通過wait函數進入狀態變量。 –

+0

它可能是萬一我的問題的答覆 – MOHAMED

+0

狀態始終爲0,沒有錯誤,萬一有腳本 – MOHAMED

回答

4

孩子的退出狀態是由wait功能提供,在status變量。

您可以通過使用WEXITSTATUS宏獲得退出狀態,但是隻有當程序正常退出(即所謂的exit或從main函數返回):

if (WIFEXITED(status)) 
    printf("Child exit status: %d\n", WEXITSTATUS(status)); 
else 
    printf("Child exited abnormally\n"); 

閱讀manual page for wait以獲取更多信息。

+0

從OP的錯誤並不清楚(「* ...得到的錯誤cmd執行... *「),如果它真的是想要的退出代碼。無論如何1+,因爲這是所有人都可以得到的。 – alk

+0

我的腳本中間出現消息錯誤,因爲中間存在錯誤。狀態返回總是爲0(在CAS中有腳本中的錯誤,而在CAS中沒有) – MOHAMED

+0

所以,爲什麼不改變這一點,並讓你的腳本只有在成功和任何錯誤調用'exit'時才使用'exit 0'與「0」不同的參數。 @MohamedKALLEL – alk