Можно ли всегда ловить сигнал, даже если программа еще только началась?

Я хотел бы перехватить сигнал, отправленный в мою программу, и выполнить простое действие (например, выйти с указанным кодом). Но если процесс получил сигнал до того, как установил мой обработчик сигнала, он вышел ненормально, как будто никакого обработчика не было.

Исходный код моей простой программы:

#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

void handler(int sig) { exit(0); }

int main()
{
signal(SIGTERM, handler);
while(1) { sleep(1); }
return 0;
}

Составлено с g++ my.c команда.

Скрипт для запуска программы непрерывно:

while true; do ./a.out; echo $?; done

Если я вручную посылаю сигнал на обработку, то в большинстве случаев все в порядке — выход с нулевым кодом. Но если я использую скрипт ниже:

Скрипт для частой отправки сигнала на обработку:

while true; do slay -sSIGTERM a.out; done

У меня много Terminated 143 Сообщения.

Но если я использую gcc (вместо g ++), я не смогу получить ситуацию с ненулевым кодом выхода.

В связи с этим вопрос о том, как мне получить программу на C ++ (скомпилированную g ++) с аналогичным поведением программы на C (скомпилированную gcc)?

Желательно в максимально стандартизированном подходе.

Протестировано на QNX 6.5, gcc 4.7.2

0

Решение

Единственный способ добиться того, чего вы хотите, это сделать так, чтобы родительский процесс блокировал все сигналы (sigprocmask) перед разветвлением и ждите, чтобы разблокировать их, пока не настроите обработчики сигналов. Все, что находится в вашей собственной программе, будет бесполезным, поскольку сигнал все еще может поступать между окном, где родительский разветвитель и где он исполняется.

1

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


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