Как приложение 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");
}
}