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

时间:2016-10-07 09:26:01

标签: c posix waitpid jsvc apache-commons-daemon

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

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

jsvc.exec error: Service did not exit cleanly

这是jsvcin 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都可以为假? 是否保证在这种情况下(通过进程或Linux OOM杀手)不会杀死进程?

1 个答案:

答案 0 :(得分:1)

WIFSTOPPED也存在,但只有在父级是ptrace的情况下才有可能:子进程(或使用不同的标志到waitpid)。

我认为最好的办法是打印状态并查看sys / wait.h中的位。虽然很难做到这一点。很多信息都被填入了这个内容中,很难弄明白。看起来您粘贴的代码已经尝试这样做,但忘记了格式字符串中的%d