当孩子崩溃时,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返回。
答案 0 :(得分:1)
如果waitpid挂起,这意味着您的孩子尚未退出。如果您的父进程有一个主循环并且您不希望waitpid挂起,请使用WNOHANG选项调用它:waitpid(pid, &status_var, WNOHANG)
。一旦waitpid没有返回0,你的孩子就会退出。
然后你就可以了。按照手册页中的说明检查WIFEXITED
,WIFSIGNALED
和WCOREDUMP
的退出原因。
答案 1 :(得分:0)
使用waitid而不是waitpid可以更精确,并检查si_status。或者您可以在您的孩子中安装信号处理程序。