Хорошо, во-первых, вы должны использовать sigaction (2) вместо устаревшего signal()
.
Во-вторых, использование SIGFPE в целях прекращения программы явно абсурдно, так как вы должны подавать сигнал, такой как SIGTERM или SIGUSR1, вместо того, чтобы настраивать какой-то другой сигнал для его побочного эффекта и игнорировать его семантическое значение. А точнее, на странице справки для sigaction (2) есть раздел NOTES с рекламой, посвященной SIGFPE, которая указывает на один или два способа, которыми вы намеренно не пользуетесь.
Что вы должны сделать, это повысить (3) сигнал, когда вы хотите завершить. Затем используйте поле sa_handler
в структуре sigaction
, чтобы изменить, игнорировать ли (SIG_IGN
) или завершить (SIG_DFL
) для этого сигнала.
int main(void) {
struct sigaction my_action;
my_action.sa_handler = SIG_IGN;
my_action.sa_flags = SA_RESTART;
sigaction(SIGUSR1, &my_action, NULL);
raise(SIGUSR1); /* Ignored */
my_action.sa_handler = SIG_DFL;
sigaction(SIGUSR1, &my_action, NULL);
raise(SIGUSR1); /* Terminates */
return 0;
}
Тем не менее, я не понимаю, почему вы использовали бы сигналы вместо простого exit()
.