Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 48 стр.

UptoLike

Составители: 

48
предварительно, вызовом функций SignalAction() (QNX) или sigaction()
(POSIX). Ниже представлен синтаксис функции sigaction().
int sigaction( int sig,
const struct sigaction * act,
struct sigaction * oact );
Аргументы:
sig – номер сигнала (как правило, задается символической константой);
act – NULL или указатель к структуре sigaction, которая специфицирует новую реакцию
на сигнал;
oact – NULL или указатель, по которому должна быть сохранена прежняя реакция сиг-
нала, определенная структурой sigaction.
Структура sigaction содержит следующие поля:
void (*sa_handler)(); адрес функции обработчика для сигналов без поддержки очеред-
ности;
void (*sa_sigaction)(int signo, siginfo_t* info, void* other); адрес функции обработчика для
сигналов с поддержкой очередности;
sigset_t sa_mask – набор сигналов, которые должны быть дополнительно маскированы
при выполнении обработчика;
int sa_flags – специальные флаги, определяющие поведение сигнала:
- SA_NOCLDSTOP – используется только для сигнала SIGCHLD и запрещает передачу
этого сигнала дочерним процессом к родительскому процессу, если дочерний процесс оста-
новлен по сигналу SIGSTOP,
- SA_SIGINFO – определяет, что для данного сигнала будет поддерживаться очередь.
По умолчанию очередь для всех сигналов не поддерживается.
Функции обработчиков sa_handler и sa_sigaction выполняются как компоненты union. Оба
обработчика разделяют одно и то же адресное пространство и отличаются только прототипа-
ми. Через эти поля можно также определить стандартные обработчики, используя символиче-
ские константы:
SIG_DFL – определяет следующие действия для специфицированных сигналов:
- сигналы SIGCHLD, SIGIO, SIGURG и SIGWINCH игнорируются,
- сигнал SIGSTOP – останавливает процесс,
- сигнал SIGCONT – продолжает программу,
- все остальные сигналы убивают процесс;
SIG_IGN – игнорирует специфицированный сигнал. Если специфицирован сигнал
SIGCHLD, то дочерний процесс не переходит в состояние зомби, а родительский не может по-
лучить от него код завершения, используя вызовы wait() или waitpid().
Возвращаемая структура siginfo_t функции обработчика (*sa_sigaction) содержит сле-
дующие поля:
- int si_signo – номер сигнала, который должен совпадать с аргументом signo;
- int si_code – код сигнала. Ядро резервирует следующие значения кодов:
– SI_USER – сигнал сгенерирован kill() функцией,
– SI_QUEUE – сигнал сгенерирован sigqueue() функцией,
– SI_TIMER – сигнал сгенерирован таймером,
– SI_ASYNCIO – сигнал сгенерирован асинхронной операцией ввода/вывода,
– SI_MESGQ – сигнал, сгенерированный POSIX-очередью сообщений.
Обработчик сигналов может завершаться вызовами longjmp() или
siglongjmp(). В первом случае после возврата из обработчика сигнал оста-
ется маскированным. Во втором случае восстанавливается маска, предва-
рительно сохраненная вызовом sigsetjmp().
Сигнал можно сгенерировать, используя POSIX-вызов kill(), синтаксис
которого представлен в следующем фрагменте.