如何阻止waitpid挂起某些输入

时间:2016-02-16 07:49:29

标签: c operating-system

当孩子崩溃时,waitpid会挂起"由于释放堆栈数组的双重自由错误或内存损坏?无论如何都要抓住这些类型的错误?

int status;
errno = 0;
pid_t wait_status = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
if (wait_status == -1) {
    fprintf(stderr, "Failed to wait for child id %d - error: %s", cpid, strerror(errno));   
    exit(wait_status);
}
if (WIFEXITED(status)) {
    pm->process_status = WEXITSTATUS(status);
    pm->status_set = true;
    return;
}
else if (WIFSIGNALED(status)) {
    fprintf(stderr, "Child process was terminated by signal %d\n", WTERMSIG(status));
    pm->process_status = -1;
}
else if (WIFSTOPPED(status)) {
    fprintf(stderr, "Child process was stopped\n"); 
    pm->process_status = -1;
}
else {
    fprintf(stderr, "Unknown child error\n");
    pm->process_status = -1;
}

我想要waitpid的阻塞行为,这适用于所有其他情况,但是当孩子因上述内存错误而崩溃时,它永远不会退出,或者让waitpid返回。

2 个答案:

答案 0 :(得分:1)

如果waitpid挂起,这意味着您的孩子尚未退出。如果您的父进程有一个主循环并且您不希望waitpid挂起,请使用WNOHANG选项调用它:waitpid(pid, &status_var, WNOHANG)。一旦waitpid没有返回0,你的孩子就会退出。

然后你就可以了。按照手册页中的说明检查WIFEXITEDWIFSIGNALEDWCOREDUMP的退出原因。

答案 1 :(得分:0)

使用waitid而不是waitpid可以更精确,并检查si_status。或者您可以在您的孩子中安装信号处理程序。