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

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

Функция sigvec() — аналог функции sigaction(). Аргументы vec и ovec — это указатели на структуры следующего типа:

struct sigvec {

void (*sv_handler)(int);

int sv_mask;

int sv_flags;

};

Поля структуры sigvec соответствуют полям структуры sigaction. Первое заметное отличие в том, что поле sv_mask раньше было целочисленным, а не типа sigset_t. Это означает, что на 32-битных архитектурах максимально можно было реализовать 31 сигнал. Еще одно отличие — в использовании флага SV_INTERRUPT в поле sv_flags (аналог sa_flags). Поскольку перезапуск системных вызовов был настройкой по умолчанию в 4.2BSD, установка этого флага означала, что медленные системные вызовы должны прерываться обработчиками сигналов. (Это кардинальным образом отличается от функций POSIX API, в случае использования которых мы должны явно устанавливать флаг SA_RESTART для включения перезапуска системных вызовов при установке обработчика сигнала с помощью функции sigaction().)

#define _BSD_SOURCE

#include


int sigblock(int mask);

int sigsetmask(int mask);

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

int sigpause(int sigmask);

Всегда возвращает –1 с установкой errno значения EINTR

int sigmask(int sig);

Возвращает значение сигнальной маски с битовым набором sig

Функция sigblock() добавляет набор сигналов в сигнальную маску процесса. Эта функция аналогична операции sigprocmask() SIG_BLOCK. Вызов sigsetmask() устанавливает абсолютное значение сигнальной маски. Эта функция аналогична операции sigprocmask() SIG_SETMASK.

Функция sigpause() аналогична функции sigsuspend(). В GNU библиотеке C по умолчанию предоставляется версия функции из системы System V, если мы не укажем макрос проверки возможностей _BSD_SOURCE при компиляции программы.

Макрос sigmask() преобразует номер сигнала в соответствующее значение 32-битной маски. Такие битовые маски могут быть объединены вместе с помощью логического оператора ИЛИ для создания набора сигналов, как показано в следующем примере:

sigblock(sigmask(SIGINT) | sigmask(SIGQUIT));


22.14. Резюме


Некоторые сигналы приводят к завершению процесса с созданием файла дампа ядра. Этот файл содержит информацию о состоянии процесса на момент завершения, которая может использоваться отладчиком. По умолчанию имя файла дампа ядра — core, но в Linux предоставляется файл /proc/sys/kernel/core_pattern для управления именованием файлов дампа.

Сигнал может быть сгенерирован синхронно и асинхронно. Асинхронная генерация происходит, когда сигнал отправляется процессу ядром или другим процессом. Процесс не может точно предсказать, когда в него будет доставлен сигнал, сгенерированный асинхронно. (Уже отмечалось, что, как правило, асинхронные сигналы доставляются в следующий раз, когда процесс-получатель переключается из режима ядра в режим пользователя.) Синхронная генерация происходит, когда сам процесс выполняет код, напрямую генерирующий сигнал, например, при выполнении кода, вызывающего аппаратное исключение или при вызове функции raise(). Доставку сигнала, генерируемого синхронно, можно предсказать с высокой точностью (она происходит мгновенно).

Сигналы реального времени — надстройка POSIX на исходную модель сигналов. Они отличаются от стандартных тем, что могут быть поставлены в очередь, имеют определенную очередность доставки, а также тем, что могут быть отправлены с сопровождающими данными. Сигналы реального времени предназначены для использования в целях, определяемых приложением. Отправка сигнала реального времени происходит с помощью системного вызова sigqueue(), а через дополнительный аргумент (структура siginfo_t), переданный обработчику сигнала, можно получить данные, сопровождающие сигнал, а также идентификатор процесса и реальный идентификатор пользователя процесса-отправителя.

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

Как и функции sigwaitinfo() и sigtimedwait(), специфичный системный вызов Linux signalfd() может использоваться для синхронного ожидания сигнала. Отличительной особенностью этого интерфейса является то, что сигналы могут быть прочитаны через файловый дескриптор. Над файловым дескриптором можно осуществлять мониторинг с помощью функций select(), poll() и epoll().

Хотя сигналы могут рассматриваться в качестве метода взаимодействия процессов (IPC), по причине многих факторов сигналы не подходят для этих целей: из-за их асинхронной природы, из-за того, что сигналы не ставятся в очередь, и из-за их низкой пропускной способности. Чаще всего, сигналы используются для синхронизации процессов и для других целей (например, оповещение о событии, управление заданиями, истечение таймера).

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

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

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#.Введите сюда краткую аннотацию

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

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