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

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

Жанры

Основы программирования в Linux
Шрифт:

Функция

sigismember
определяет, включен ли заданный сигнал в множество сигналов. Она возвращает 1, если сигнал является элементом множества, 0, если нет и -1 с
errno
, равной
EINVAL
, если сигнал неверный.

#include <signal.h>

int sigismember(sigset_t *set, int signo);

Маска сигналов процесса задается и просматривается с помощью функции

sigprocmask
. Маска сигналов — это множество сигналов, которые заблокированы в данный момент и не будут
приниматься текущим процессом.

#include <signal.h>

int sigprocmask(int how, const sigset_t *set, sigset_t *oset);

Функция

sigprocmask
может изменять маску сигналов процесса разными способами в соответствии с аргументом
how
. Новые значения маски сигналов передаются в аргументе
set
, если он не равен
null
, а предыдущая маска сигналов будет записана в множество сигналов
oset
.

Аргумент

how
может принимать одно из следующих значений:

SIG_BLOCK
— сигналы аргумента
set
добавляются к маске сигналов;

SIG_SETMASK
—маска сигналов задается аргументом
set
;

SIG_UNBLOCK
— сигналы в аргументе
set
удаляются из маски сигналов.

Если аргумент

set
равен
null
, значение
how
не используется и единственная цель вызова — перенести значение текущей маски сигналов в аргумент
oset
.

Если функция

sigprocmask
завершается успешно, она возвращает 0. Функция вернет -1, если параметр
how
неверен, в этом случае переменная
errno
будет равна
EINVAL
.

Если сигнал заблокирован процессом, он не будет доставлен, но останется ждать обработки. Программа может определить с помощью функции

sigpending
, какие из заблокированных ею сигналов ждут обработки.

#include <signal.h>

int sigpending(sigset_t *set);

Она записывает множество сигналов, заблокированных от доставки и ждущих обработки, в множество сигналов, на которое указывает аргумент

set
. Функция возвращает 0 при успешном завершении и -1 в противном случае с переменной
errno
, содержащей ошибку. Данная функция может пригодиться, когда программе потребуется обрабатывать сигналы и управлять моментом вызова функции обработки.

С помощью функции

sigsuspend
процесс может приостановить выполнение, пока не будет доставлен один сигнал из множества сигналов. Это более общая форма функции
pause
, с которой вы уже встречались.

#include <signal.h>

int sigsuspend(const sigset_t *sigmask);

Функция

sigsuspend
замещает маску сигналов процесса множеством сигналов, заданным в аргументе
sigmask
, и затем приостанавливает выполнение. Оно будет возобновлено после выполнения функции обработки
сигнала. Если полученный сигнал завершает программу,
sigsuspend
никогда не вернет ей управление. Если полученный сигнал не завершает программу,
sigsuspend
вернет с переменной
errno
, равной
EINTR
.

Флаги sigaction

Поле

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

Таблица 11.5

Имя сигнала Описание
SA_NOCLDSTOP
Не генерируется
SIGCHLD
, когда дочерние процессы остановлены
SA_RESETHAND
Восстанавливает при получении действие, соответствующее значению
SIG_DFL
SA_RESTART
Перезапускает прерванные функции вместо ошибки
EINTR
SA_NODEFER
При перехвате сигнала не добавляет его а маску сигналов

Флаг

SA_RESETHAND
может применяться для автоматической очистки функции сигнала при захвате сигнала, как мы видели раньше.

Многие системные вызовы, которые использует программа, прерываемые, т.е. при получении сигнала они вернутся с ошибкой и переменная

errno
получит значение
EINTR
, чтобы указать, что функция вернула управление в результате получения сигнала. Поведение требует повышенного внимания со стороны приложения, использующего сигналы. Если в поле
sa_flags
функции
sigaction
установлен флаг
SA_RESTART
, функция, которая в противном случае могла быть прервана сигналом, вместо этого будет возобновлена, как только выполнится функция обработки сигнала.

Обычно, когда функция обработки сигнала выполняется, полученный сигнал добавляется в маску сигналов процесса во время работы функции обработки. Это препятствует последующему появлению того же сигнала, заставляющему функцию обработки сигнала выполняться снова. Если функция не реентерабельная, вызов ее другим экземпляром сигнала до того, как она завершит обработку первого сигнала, может создать проблемы. Но если установлен флаг

SA_NODEFER
, маска сигнала не меняется при получении этого сигнала.

Функция обработки сигнала может быть прервана в середине и вызвана снова чем-нибудь еще. Когда вы возвращаетесь к первому вызову функции, крайне важно, чтобы она все еще действовала корректно. Она должна быть не просто рекурсивной (вызывающей саму себя), а реентерабельной (в нее можно войти и выполнить ее снова). Подпрограммы ядра, обслуживающие прерывания и имеющие дело с несколькими устройствами одновременно, должны быть реентерабельными, поскольку высокоприоритетное прерывание может "войти" в тот код, который выполняется.

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

Справедливость для всех

Николаев Игорь Игоревич
6. Ойкумена
Фантастика:
эпическая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Справедливость для всех

Я уже царь. Книга XXIX

Дрейк Сириус
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже царь. Книга XXIX

Статьи из "Арабесок"

Гоголь Николай Васильевич
Другие редакции
Документальная литература:
публицистика
4.75
рейтинг книги
Статьи из Арабесок

Сила монстров

Чейз Ева
2. Тенекровные
Фантастика:
городское фэнтези
зарубежная фантастика
ужасы и мистика
5.00
рейтинг книги
Сила монстров

Одиссея капитана Балка. Дилогия

Чернов Александр Викторович
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Одиссея капитана Балка. Дилогия

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.25
рейтинг книги
Второгодка. Книга 3. Ученье свет

Именем закона. Сборник № 1

Ромов Анатолий Сергеевич
Детективы:
прочие детективы
4.00
рейтинг книги
Именем закона. Сборник № 1

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Не говори мне о любви

Леонова Юлия Сергеевна
Любовные романы:
исторические любовные романы
8.36
рейтинг книги
Не говори мне о любви

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Загадки истории. Факты. Открытия. Люди

Ермановская Анна Эдуардовна
Научно-образовательная:
история
7.00
рейтинг книги
Загадки истории. Факты. Открытия. Люди

Рассвет русского царства 3

Грехов Тимофей
3. Новая Русь
Фантастика:
историческое фэнтези
альтернативная история
5.00
рейтинг книги
Рассвет русского царства 3

Марсианские войны (сборник)

Берроуз Эдгар Райс
1. Марсианин Джон Картер
Фантастика:
научная фантастика
7.71
рейтинг книги
Марсианские войны (сборник)

Второгодка. Книга 5. Презренный металл

Ромов Дмитрий
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл