Необычные номера сигналов из макроса WTERMSIG после waitpid ()

Я вижу необычные номера сигналов (например, 50, 80 или 117) из следующего кода, ожидая завершения дочернего процесса. Я вижу это только от одного конкретного дочернего процесса, и у меня нет доступа к исходному коду процесса, и это происходит только иногда.

Я хочу знать, что означают эти необычные значения, учитывая NSIG == 32, и где я могу найти некоторую документацию в заголовках или на страницах руководства?

Обратите внимание, что этот код выполняется в цикле, посылая все более угрожающие сигналы, пока дочерний процесс не завершится.

int status, signal;

if (waitpid(m_procId, &status, WNOHANG) < 0) {
LOGERR << "Failed to wait for process " << name() << ": " <<
strerror(errno) << " (" << errno << ")";
break;
} else if (WIFEXITED(status)) {
m_exitCode = WEXITSTATUS(status);
terminated = true;
LOGINF << "Process " << name() << " terminated with exit code " << m_exitCode;
} else if (WIFSIGNALED(status)) {
signal = WTERMSIG(status);    // !!! signal is sometimes 50, 80 or 117 !!!
terminated = true;
LOGINF << "Process " << name() << " terminated by signal " << signal;
} else {
LOGWRN << "Process " << name() << " changed state but did not terminate.  status=0x" <<
hex << status;
}

Это работает под OSX 10.8.4, но я также видел это в 10.9 GM seed.

РЕДАКТИРОВАТЬ Изменение кода, как показано ниже, делает код более устойчивым, однако иногда дочерний процесс становится осиротевшим, так как я полагаю, что цикл не делает достаточно для уничтожения дочернего процесса.

else if (WIFSIGNALED(status)) {
signal = WTERMSIG(status);
if (signal < NSIG) {
terminated = true;
LOGINF << "Process " << name() << " terminated by signal " << signal;
} else {
LOGWRN << "Process " << name() << " produced unusual signal " << signal
<< "; assuming it's not terminated";
}
}

Обратите внимание, что этот код является частью Process::unload() метод этого учебный класс.

0

Решение

От Страница руководства по OS X для waitpid, при указании WNOHANG вы должны проверить возврат 0:

 When the WNOHANG option is specified and no processes wish to report status, wait4() returns a process
id of 0.

The waitpid() call is identical to wait4() with an rusage value of zero.  The older wait3() call is the
same as wait4() with a pid value of -1.

Размещенный код не проверяет это, что говорит о том, что значение status скорее всего мусор (значение int никогда не инициализируется). Это может вызвать то, что вы видите.

РЕДАКТИРОВАТЬ: status действительно устанавливается только тогда, когда waitpid возвращает> 0.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]