Разве сигнал вызова не установит обработчик раз и навсегда?
Вы не можете полагаться на это поведение; возможно, обработчик сигнала будет очищен, возможно, он сохранится. Это часть проблемы с исторической обработкой сигналов. Справочная страница signal(3)
в моей системе сообщает:
When a signal occurs, and func points to a function, it is
implementation-defined whether the equivalent of a:
signal(sig, SIG_DFL);
is executed or the implementation prevents some
implementation-defined set of signals (at least including
sig) from occurring until the current signal handling has
completed.
Ненадежные сигналы были почти заменены сигналами sigaction(2)
, введенными в SysVr4 и стандартизированными в POSIX.1-2001:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
К сожалению, их сложнее написать, но как только вы напишете код, вам не придется задумываться, нужно ли вам переустанавливать свой обработчик, и вам не придется беспокоиться о том, что сигнал будет прибыть во второй раз при обработке сигнала.