Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

Таким образом,

sigaction
и устанавливает новый обработчик, и получает старый за одно действие.
struct sigaction
выглядит следующим образом.

/* ПРИМЕЧАНИЕ: Порядок в структуре может варьировать. Могут быть

также и другие поля! */

struct sigaction {

 sigset_t sa_mask; /* Дополнительные сигналы для блокирования */

 int sa_flags; /* Контролирует поведение */

 void (*sa_handler)(int);

/* Может образовать объединение с sa_sigaction */

 void (*sa_sigaction)(int, siginfo_t*, void*);

/* Может образовать объединение с sa_handler */

}

Поля

следующие:

sigset_t sa_mask

Набор дополнительных сигналов для блокирования при запуске функции обработчика. Таким образом, когда вызывается обработчик, общий набор заблокированных сигналов является объединением сигналов в маске процесса, сигналов в

act->mask
и, если
SA_NODEFER
сброшен,
signum
.

int sa_flags

Флаги, контролирующие обработку сигнала ядром. См. обсуждение далее.

void (*sa_handler)(int)

Указатель на «традиционную» функцию обработчика. У нее такой же прототип (возвращаемый тип и список параметров), как у функции обработчика для

signal
,
bsd_signal
и
sigset
.

void (*sa_sigaction)(int, siginfo_t*, void*)

Указатель на функцию обработчика «нового стиля». Функция принимает три аргумента, которые вскоре будут описаны.

Которая из функций

act->sa_handler
и
act->sa_sigaction
используется, зависит от флага
SA_SIGINFO
в
act->sa_flags
. Когда имеется, используется
act->sa_sigaction
; в противном случае используется
act->sa_handler
. Как POSIX, так и справочная страница GNU/Linux указывают, что эти два поля могут перекрываться в памяти (т. е. быть частью
union
). Таким образом, никогда не следует использовать оба поля в одной и той же
struct sigaction
.

Поле

sa_flags
составляется с помощью побитового ИЛИ значений одного или более флагов, перечисленных в табл. 10.3.

Таблица 10.3. Значения флагов для

sa_flags

Флаг Значение
SA_NOCLDSTOP
Этот флаг имеет смысл лишь для
SIGCHLD
. Когда он установлен, родитель не получает сигнал при остановке порожденною процесса сигналами
SIGSTOP
,
SIGTSTP
,
SIGTTIN
или
SIGTTOU
. Эти сигналы обсуждаются позже, в разделе 10.8.2
SA_NOCLDWAIТ
Этот флаг имеет смысл лишь для
SIGCHLD
. Его поведение сложно. Мы отложим объяснение на потом, см. раздел 10.8.3
SA_NODEFER
Обычно данный сигнал блокируется, когда вызывается обработчик сигнала. Когда установлен один из этих флагов, данный сигнал не блокируется при запуске обработчика
SA_NODEFER
является официальным именем POSIX данного флага (которое и следует использовать)
SA_NOMASK
Альтернативное имя для
SA_NODEFER
[110]
SA_SIGINFO
Обработчик сигнала принимает три аргумента. Как упоминалось, при данном установленном флаге должно использоваться поле
sa_sigaction
вместо
sa_handler
.
SA_ONSTACK
Это продвинутая возможность. Обработчики сигналов могут вызываться с использованием предоставленной пользователем памяти в качестве «альтернативного стека сигнала». Эта память даётся ядру для подобного использования посредством
sigaltstack
(см. sigaltstack(2)). Эта особенность больше не описывается в данной книге
SA_RESETHAND
Этот
флаг обеспечивает поведение V7: после вызова обработчика восстанавливается действие сигнала по умолчанию. Официальным именем POSIX флага (которое следует использовать) является
SA_RESETHAND
SA_ONESHOT
Альтернативное имя для
SA_RESETHAND.
SA_RESTART
Этот флаг предоставляет семантику BSD: системные вызовы, которые могут завершиться с ошибкой
EINTR
и которые получают этот сигнал, запускаются повторно.

110

Насколько мы смогли определить, имена

SA_NOMASK
и
SA_ONESHOT
являются специфическими для GNU/Linux. Если кому-нибудь известно иное, пожалуйста, сообщите нам!

Когда в

act->sa_flags
установлен флаг
SA_SIGINFO
, поле
act->sa_sigaction
является указателем на функцию, объявленную следующим образом:

void action_handler(int sig, siginfo_t *info, void *context) {

 /* Здесь тело обработчика */

}

Структура

siginfo
_t предоставляет изобилие сведений о сигнале:

/* Определение 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_signo
,
si_code
и
si_value
доступны для всех сигналов. Другие поля могут быть членами объединения, поэтому должны использоваться лишь для тех сигналов, для которых они определены. В структуре
siginfo_t
могут быть также и другие поля.

Почти все поля предназначены для расширенного использования. Все подробности содержатся в стандарте POSIX и справочной странице sigaction(2). Однако, мы можем описать простое использование поля

si_code
.

Для

SIGBUS
,
SIGCHLD
,
SIGFPE
,
SIGILL
,
SIGPOLL
,
SIGSEGV
и
SIGTRAP
поле si_code может принимать любое из набора предопределенных значений, специфичных для каждого сигнала, указывая на причину появления сигнала. Откровенно говоря, детали несколько чрезмерны; повседневному коду на самом деле нет необходимости иметь с ними дела (хотя позже мы рассмотрим значения для
SIGCHLD
). Для всех остальных сигналов член
si_code
имеет одно из значений из табл. 10.4.

Таблица 10.4. Значения происхождения сигнала для

si_code

Поделиться:
Популярные книги

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7

Двойник короля 21

Скабер Артемий
21. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 21

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Кодекс Охотника. Книга XXXV

Винокуров Юрий
35. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXV

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Сильнейший Столп Империи. Книга 2

Ермоленков Алексей
2. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 2

Эволюционер из трущоб

Панарин Антон
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб

Эпоха Опустошителя. Том VI

Павлов Вел
6. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том VI

Ярар. Начало

Грехов Тимофей
1. Ярар
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ярар. Начало

Телохранитель Генсека. Том 3

Алмазный Петр
3. Медведев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Телохранитель Генсека. Том 3

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Меченный смертью. Том 1

Юрич Валерий
1. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Меченный смертью. Том 1
Значение Только GLIBC Смысл
SI_ASYNCIO
Асинхронный ввод/вывод завершен (расширенный).
SI_KERNEL
Сигнал послан ядром.
SI_MESGQ
Состояние очереди сообщений изменилось (расширенный.)
SI_QUEUE
Сигнал послан из
sigqueue
(расширенный).