gpt4 book ai didi

c - 如何阻止 waitpid 卡在某些输入上

转载 作者:太空宇宙 更新时间:2023-11-04 03:32:13 28 4
gpt4 key购买 nike

当子进程由于双重释放错误或释放堆栈数组造成的内存损坏而“崩溃”时,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 返回。

最佳答案

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

然后你可以,例如。如手册页中所述,使用 WIFEXITEDWIFSIGNALEDWCOREDUMP 检查退出原因。

关于c - 如何阻止 waitpid 卡在某些输入上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35426665/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com