Читаем Linux API. Исчерпывающее руководство полностью

Пример использования функции 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 в качестве верхней границы цикла при проверке всех номеров сигналов на членство в наборе.

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

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

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных