Я хотел бы перехватить сигнал, отправленный в мою программу, и выполнить простое действие (например, выйти с указанным кодом). Но если процесс получил сигнал до того, как установил мой обработчик сигнала, он вышел ненормально, как будто никакого обработчика не было.
Исходный код моей простой программы:
#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
Единственный способ добиться того, чего вы хотите, это сделать так, чтобы родительский процесс блокировал все сигналы (sigprocmask
) перед разветвлением и ждите, чтобы разблокировать их, пока не настроите обработчики сигналов. Все, что находится в вашей собственной программе, будет бесполезным, поскольку сигнал все еще может поступать между окном, где родительский разветвитель и где он исполняется.