Прежде всего, ваш вопрос («Я в обработчике сигналов?») Не имеет четко определенного ответа. Рассмотрим следующий код:
#include <setjmp.h>
#include <signal.h>
jmp_buf jb;
int foo(int s)
{
longjmp(jb,1);
}
int main()
{
if (setjmp(jb)) {
puts("Am I in a signal handler now, or not?");
return 0;
}
signal(SIGINT, foo);
raise(SIGINT);
}
С учетом вышесказанного, существует методика, которую вы могли бы использовать для значимого ответа на этот вопрос для многих программ. Выберите сигнал, который вы не собираетесь использовать, и добавьте его в sa_mask
для всех обрабатываемых вами сигналов, установив обработчики сигналов с помощью sigaction
. Затем вы можете использовать sigprocmask
, чтобы проверить текущую маску сигнала, и если указанный вами сигнал находится в маске сигнала, это означает, что обработчик сигнала был вызван и еще не возвращен (возврат приведет к восстановлению исходной маски сигнала).