Нет «стандартного обработчика сигнала»;вместо этого ядром выполняется действие по умолчанию, когда сигнал не обрабатывается.Если вы хотите что-то сделать, когда сигнал получен, а затем перейти к действию по умолчанию, вы можете сделать следующее в конце вашего обработчика сигнала:
sigset_t set;
signal(sig, SIG_DFL);
raise(sig);
sigemptyset(&set);
sigaddset(&set, sig);
sigprocmask(SIG_UNBLOCK, &set, 0);
Это предполагает, что вы использовали sigaction
дляустановите ваш обработчик сигнала и не указывайте флаги SA_NODEFER
или SA_RESETHAND
.Также возможно достичь того, что вы хотите, используя эти флаги и просто вызывая raise
, но это имеет ужасные условия гонки, если сигнал доставляется дважды в быстрой последовательности, поэтому вы не должны этого делать;вместо этого используйте предложенный мной метод.
Редактировать: На самом деле вам не нужно ничего делать с маской сигналов, поскольку возврат из обработчика сигналов восстановит старую маску сигналов.Просто это должно работать:
signal(sig, SIG_DFL);
raise(sig);
return;