waitpid — в каких случаях и WIFEXITED, и WIFSIGNALED будут ложными?

Я запускаю программу Java в качестве демона в Linux, используя jsvc от Apache commons-daemon< /а>.

Демон «случайно» падает с одним только сообщением:

jsvc.exec error: Service did not exit cleanly

Это соответствующая часть кода в jsvc (в jsvc-unix.c строке 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;
}

В каком случае WIFEXITED и WIFSIGNALED могут быть ложными? Гарантируется ли, что в этом случае процесс не был убит (процессом или убийцей Linux OOM)?


person nicoulaj    schedule 07.10.2016    source источник
comment
Ребенок также может быть возобновлен (тогда должно быть установлено WIFCONTINUED(status))   -  person Karsten Koop    schedule 07.10.2016
comment
@KarstenKoop Вы получите это, только если передадите WCONTINUED в waitpid, чего здесь не делается.   -  person nos    schedule 07.10.2016


Ответы (1)


WIFSTOPPED тоже существует, но это возможно только в том случае, если родитель ptrace:ing дочерний процесс (или с другими флагами для waitpid).

Я думаю, что вам лучше всего распечатать статус и просмотреть биты в sys/wait.h. Хотя это довольно сложно понять правильно. В этот int помещается много информации, и ее трудно понять. Похоже, код, который вы вставили, уже пытается это сделать, но забыл %d в строке формата.

person Art    schedule 07.10.2016
comment
Действительно, я перекомпилировал jsvc, чтобы в следующий раз он печатал статус, подождите и увидите... - person nicoulaj; 07.10.2016