2010-03-29 99 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