Как приложение Linux может быть прервано сигналом с номером больше 63 (WTERMSIG() > 63)?

Как WTERMSIG() может оценить значение больше 63, например 67 или 123?

Вот как это происходит. Я использую popen () для запуска unbuffer, который, в свою очередь, запускает скрипт оболочки. Следующий блок кода - это цикл while (), который читает из файлового дескриптора, возвращаемого popen (), до тех пор, пока не получит NULL. Затем следует pclose ().

В редких случаях pclose () вернет значение!= -1 и установит WIFSIGNALED() в true. Странная часть состоит в том, что WTERMSIG() затем оценивается в значение больше 63, например 67 или 123. Что может вызвать это?

Сценарий оболочки выполняет все свои задачи, поэтому он не прерывается на полпути. Я мог понять 1–31 (стандартные сигналы) или 32–63 (расширенные сигналы в реальном времени). Попытка генерировать сигналы 67 или 123 на нашей платформе (Timesys Linux) приводит к ошибке.

Вот некоторые из соответствующих кодов:

FILE* fp = popen(command.c_str(), "r");
if (fp == NULL) {
    // Handle error
}

while (fgets(line, sizeof(line), fp) != NULL) {
    // Do stuff with output of child process
}

pclose_status = pclose(fp);
pclose_errno = errno;

if (pclose_status != -1 && WIFEXITED(pclose_status)) {
    // Happy ending, occurs 99% of the time
    return (WEXITSTATUS(pclose_status)));
}

// Check if pclose returned an error. If so, log the result.
if (pclose_status == -1) {
    // Log an error and pclose_errno
}
else {
    if (WIFSIGNALED(pclose_status)) {
        // This happens maybe 1% of the time, but the value 
        // printed is > 63.
        Syslog::error("Child process terminated by signal %d", 
                       WTERMSIG(pclose_status));
    }
    if (WIFSTOPPED(pclose_status)) {
        // Hasn't happened.
        Syslog::error("Child process stopped by delivery of signal %d",
                       WSTOPSIG(pclose_status));
    }
    if (WIFCONTINUED(pclose_status)) {
        // Hasn't happened.
        Syslog::error("Child process resumed by delivery of SIGCONT");
    }
}

0 ответов

Другие вопросы по тегам