gpt4 book ai didi

c - waitpid - 在哪些情况下 WIFEXITED 和 WIFSIGNALED 都是假的?

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:26 25 4
gpt4 key购买 nike

我正在使用 Apache commons-daemon's jsvc 在 Linux 上将 Java 程序作为守护进程运行.

守护进程“随机”崩溃,只有消息:

jsvc.exec error: Service did not exit cleanly

这是 jsvc ( in jsvc-unix.c line 1142 ) 中代码的相关部分:

while (waitpid(pid, &status, 0) != pid) {
/* Waith for process */
}

/* The child must have exited cleanly */
if (WIFEXITED(status)) {
status = WEXITSTATUS(status);

// Clean exit code...
}
else {
if (WIFSIGNALED(status)) {
log_error("Service killed by signal %d", WTERMSIG(status));
/* prevent looping */
if (laststart + 60 > time(NULL)) {
log_debug("Waiting 60 s to prevent looping");
sleep(60);
}
continue;
}
log_error("Service did not exit cleanly", status);
return 1;
}

在什么情况下 WIFEXITEDWIFSIGNALED 都可以为 false?是否保证在这种情况下进程没有被杀死(被进程或 Linux OOM killer 杀死)?

最佳答案

WIFSTOPPED 也存在,但只有当父进程正在 ptrace:ing 子进程(或使用不同的 waitpid 标志)时才有可能。

我认为最好的办法是打印状态并查看 sys/wait.h 中的位。虽然很难做到正确。很多信息都被塞进了那个 int 中,很难弄清楚。看起来您粘贴的代码已经尝试执行此操作,但忘记了格式字符串中的 %d

关于c - waitpid - 在哪些情况下 WIFEXITED 和 WIFSIGNALED 都是假的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39913885/

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