Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Когда в
act->sa_flagsSA_SIGINFOact->sa_sigactionvoid action_handler(int sig, siginfo_t *info, void *context) { /* Здесь тело обработчика */}Структура
siginfo/* Определение POSIX 2001. Действительное содержание может на разных системах быть разным. */typedef struct { int si_signo; /* номер сигнала */ int si_errno; /* значение <errno.h> при ошибке */ int si_code; /* код сигнала; см. текст */ pid_t si_pid; /* ID процесса, пославшего сигнал */ uid_t si_uid; /* настоящий UID посылающего процесса */ void *si_addr; /* адрес вызвавшей ошибку инструкции */ int si_status; /* значение завершения, может включать death-by-signal */ long si_band; /* связывающее событие для SIGPOLL/SIGIO */ union sigval si_value; /* значение сигнала (расширенное) */} siginfo_t;Поля
si_signosi_codesi_valuesiginfo_tПочти все поля предназначены для расширенного использования. Все подробности содержатся в стандарте POSIX и справочной странице sigaction(2). Однако, мы можем описать простое использование поля
si_codeДля
SIGBUSSIGCHLDSIGFPESIGILLSIGPOLLSIGSEGVSIGTRAPSIGCHLDsi_codeТаблица 10.4. Значения происхождения сигнала для
si_code| Значение | Только GLIBC | Смысл |
|---|---|---|
SI_ASYNCIO | Асинхронный ввод/вывод завершен (расширенный). | |
SI_KERNEL | √ | Сигнал послан ядром. |
SI_MESGQ | Состояние очереди сообщений изменилось (расширенный.) | |
SI_QUEUE | Сигнал послан из sigqueue() | |
SI_SIGIO | √ | SIGIO |
SI_TIMER | Время таймера истекло | |
SI_USER | Сигнал послан функцией kill()raise()abort() |
В особенности полезно значение
SI_USERraise()kill()raise()kill()Третий аргумент обработчика сигнала с тремя аргументами,
void *contexНаконец, чтобы увидеть
sigaction()sort.c2074 static void2075 sighandler(int sig)2076 {2077 #ifndef SA_NOCLDSTOP /* В системе старого стиля... */2078 signal(sig, SIG_IGN); /* - для игнорирования sig используйте signal()*/2079 #endif - /* В противном случае sig автоматически блокируется */20802081 cleanup(); /* Запуск кода очистки */20822083 #ifdef SA_NOCLDSTOP /* В системе в стиле POSIX... */2084 {2085 struct sigaction sigact;20862087 sigact.sa_handler = SIG_DFL; /* - Установить действие по умолчанию */2088 sigemptyset(&sigact.sa_mask); /* - Нет дополнительных сигналов для блокирования */2089 sigact.sa_flags = 0; /* - Специальные действия не предпринимаются */2090 sigaction(sig, &sigact, NULL); /* - Поместить на место */2091 }2092 #else /* На системе в старом стиле... */2093 signal(sig, SIG_DFL); /* - Установить действие по умолчанию */2094 #endif