Пример использования функции strsignal() приведен в листинге 20.4 далее.

Функция psignal() выводит (в стандартное устройство вывода сообщений об ошибках) строку, соответствующую аргументу msg, добавляет двоеточие, а затем выводит описание сигнала sig. Как и функция strsignal(), функция psignal() чувствительна к локали.

#include

void psignal(int sig, const char *msg);

Несмотря на то что функции psignal(), strsignal() и массив sys_siglist не прописаны в SUSv3, они тем не менее доступны во многих реализациях UNIX. (В SUSv4 были добавлены спецификации функций psignal() и strsignal().)

20.9. Наборы сигналов

Многие системные вызовы, связанные с сигналами, должны быть в состоянии представлять группу различных сигналов. Например, sigaction() и sigprocmask() позволяют программе указать группу сигналов, которые должны быть заблокированы процессом, тогда как sigpending() возвращает группу сигналов, находящихся в настоящее время в режиме ожидания процесса. (Перечисленные системные вызовы будут описаны позже.)

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

В Linux, как и в большинстве других реализаций UNIX, тип данных sigset_t — это битовая маска. Однако стандарт SUSv3 этого не требует. Следовательно, набор сигналов может быть представлен структурой другого типа. Единственное, чего требует SUSv3, — чтобы тип данных был присваиваемым. Таким образом, он должен быть реализован через некий скалярный тип (например, целое число) или структуру С (возможно, содержащую массив целых чисел).

Функция sigemptyset() инициализирует набор сигналов, не содержащий членов. Функция sigfillset() инициализирует набор сигналов, содержащий все сигналы (в том числе все сигналы реального времени).

#include

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t, *set);

Обе функции возвращают 0 при успешном завершении или –1 при ошибке

Для инициализации набора сигналов должна быть использована одна из функций sigemptyset() и sigfillset(). Это необходимо потому, что язык С не инициализирует автоматические переменные, а инициализация статических переменных нулем, вероятно, не может считаться надежным способом указания пустого набора сигналов, так как наборы сигналов могут быть реализованы посредством структур, отличных от битовых масок. (По этой же причине неправильным шагом будет применение функции memset(3) для обнуления содержимого набора сигналов, чтобы пометить данный набор как пустой.)

После инициализации отдельные сигналы могут быть добавлены в набор с помощью функции sigaddset() и удалены — с помощью sigdelset().

#include

int sigaddset(sigset_t *set, int sig);

int sigdelset(sigset_t *set, int sig);

Обе функции возвращают 0 при успешном завершении или –1 при ошибке

Для обеих функций sigaddset() и sigdelset() аргумент sig — это номер сигнала.

Функция sigismember() проверяет, является ли данный сигнал членом набора.

#include

int sigismember(sigset_t *set, int sig);

Возвращает 1, если sig входит в набор set, 0 — если не входит, –1 при ошибке

Функция sigismember() возвращает 1 (истина), если sig является членом set, 0 (ложь), если не является, и –1 при ошибке (например, sig не является допустимым номером сигнала).

В GNU-библиотеке C реализованы три нестандартные функции, выполняющие задачи, которые дополняют стандартные функции наборов сигналов, описанные выше.

#define _GNU_SOURCE

#include

int sigandset(sigset_t *set, sigset_t *left, sigset_t *right);

int sigorset(sigset_t *set, sigset_t *left, sigset_t *right);

Обе функции возвращают 0 при успешном завершении или –1 при ошибке

int sigisemptyset(const sigset_t *set);

Возвращает 1 если set пуст, иначе — 0

Вышеприведенные функции выполняют следующие задачи:

• sigandset() — помещает пересечение наборов left и right в набор dest;

• sigorset() — помещает объединение наборов left и right в набор dest;

• sigisemptyset() — возвращает 1, если set не содержит сигналов, 0 в противном случае.

Пример программы

Используя функции, рассмотренные в этом разделе, мы можем написать функции, приведенные в листинге 20.4, которые будем применять далее в различных программах. Первая, printSigset(), отображает сигналы, являющиеся членами указанного набора. В этой функции задействуется константа NSIG, определенная в файле , со значением, на единицу большим, чем самый большой номер сигнала. Мы используем константу NSIG в качестве верхней границы цикла при проверке всех номеров сигналов на членство в наборе.

Перейти на страницу:

Похожие книги