2010-03-29 159 views
0

創建子進程並立即退出(_exit())後,我想執行等待並檢查狀態。現在我想知道if/else結構的'else'分支是否也需要檢查WIFSIGNALED。據我瞭解,如果我執行等待,a)可能發生了錯誤(-1),那麼孩子可能通過(exit()或_exit())正常終止,或者它可能已被終止信號,所以檢查可以省略,對吧?等待後檢查狀態()

//remainder omitted 

int status; 

pid_t t_pid = wait(&status); 

if (t_pid == -1) { 
    perror("wait"); 
    exit(EXIT_FAILURE); 
} 

if (WIFEXITED(status)) { 
    printf("child terminated normally, status = %d\n", 
      WEXITSTATUS(status) 
    ); 
} else { // <-- do it have to check for WIFSIGNALED() here? 
    printf("child was terminated by a signal, signum = %d\n", 
      WTERMSIG(status) 
    ); 
} 

回答

1

是的,你是對的 - 如果wait成功,則WIFEXITED()WIFSIGNALED()將成立。

1

是的。 POSIX.1狀態:

如果信息指向 stat_loc儲存通過調用 waitpid函數()沒有指定 WUNTRACED或WCONTINUED標誌,或由 調用wait()的函數,正好是 其中一個宏WIFEXITED(* stat_loc) 和WIFSIGNALED(* stat_loc)將 評估爲非零值。

使用waitpid()與WUNTRACED或WCONTINUED,有可能獲得一個狀態,其中WIFSTOPPED(* stat_loc)或WIFCONTINUED(* stat_loc)是真實的,而不是。

+0

+1非常好的解釋,thx – helpermethod 2010-03-29 21:04:16