等待()后检查状态

时间:2010-03-29 12:19:52

标签: c unix systems-programming

创建子进程并立即退出(_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)
    );
}

3 个答案:

答案 0 :(得分:1)

我不知道。

但你可以让你的孩子“异常”死去。在孩子身上杀死(getpid())?

http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=/com.ibm.ztpf-ztpfdf.doc_put.cur/gtpc2/cpp_wifsignaled.html

从文档中的单词的声音我会说你正确地做到了。

答案 1 :(得分:1)

是的,您是对的 - 如果wait成功,那么WIFEXITED()WIFSIGNALED()将为真。

答案 2 :(得分:1)

是。 POSIX.1州:

  

如果指出的信息   stat_loc是通过调用存储的   waitpid()没有指定   WUNTRACED或WCONTINUED标志,或由   完全调用wait()函数   其中一个宏WIFEXITED(* stat_loc)   和WIFSIGNALED(* stat_loc)应   评估为非零值。

waitpid()与WUNTRACED或WCONTINUED一起使用,可以获得WIFSTOPPED(* stat_loc)或WIFCONTINUED(* stat_loc)为真的状态。