Первое поле
sa_handler•
SIG_DFLSIG_DFLSIG_IGN•
SIG_IGN• адрес функции-обработчика, устанавливаемой как реакция на поступление этого сигнала. Эта функция будет выполняться при поступлении сигнала
signosignoВторое поле
sa_masksa_masksa_handlersa_handlersignosa_masksa_handlerПоле
sa_flagssigno•
SA_RESETHANDSIG_DFL•
SA_NOCLDSTOPSIGCHLDSIGCHLDSIGSTOP•
SA_SIGINFOsa_sigactionsa_handlersiginfo_t<sys/siginfo.h>Приведем несколько небольших и самых простых примеров использования модели надежных сигналов.
1. Перехватчик сигнала
SIGINT
void catchint(int signo) {
cout << "SIGINT: signo = " << signo << endl;
}
int main() {
static struct sigaction act = { &catchint, 0, (sigset_t)0 };
// запрещаем любые сигналы на время обработки SIGINT:
sigfillset(&(act.sa_mask));
// до этого вызова реакцией на Ctrl+C будет завершение задачи:
sigaction(SIGINT, &act, NULL);
for (int i = 0; i < 20; i++)
sleep(1), cout << "Cycle # " << i << endl;
}Результатом нормального (без вмешательства оператора) выполнения приложения будет последовательность из 20 циклов секундных ожиданий, но если в процессе этих ожиданий пользователь пытается прервать работу процесса по [Ctrl+C], то он получит вывод, подобный следующему:
...
Cycle # 10
... здесь пользователь пытается прервать программу
SIGINT: signo = 2
Cycle # 11
...2. Запрет прерывания выполнения программы с терминала. Для этого достаточно заменить строку инициализации структуры
sigaction
static struct sigaction act = { SIG_IGN, 0, (sigset_t)0 };Можно проигнорировать сразу несколько сигналов (прерывающих выполнение программы с клавиатуры):
sigaction(SIGINT, &act, NULL );
sigaction(SIGQUIT, &act, NULL);Далее остановимся еще на одном вызове API-сигналов, который широко используется в этой и последующих моделях обработки (сигналы реального времени, реакция в потоках):
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);Этот вызов позволяет прочитать текущее значение (если
setNULLhow•
set•
how•
SIG_BLOCK•
SIG_UNBLOCK•
SIG_SETMASKset•
oset29
Все это и делает механизм обработки более надежным по сравнению с более ранним механизмом, который описывался выше.
30
Спецификация XSI требует, чтобы процесс использовал либо поле
sa_handlersa_sigactionsigactionunion31
Модель очереди сигналов введена главным образом для обеспечения сигналов реального времени и будет рассмотрена ниже.
32
Инициализации, используемые в примерах вида
sigaction act = { &catchint, 0, (sigset_t)0};struct sigaction