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

continue; /* Запуск в течение нескольких секунд */


printPendingSigs(stdout,

"Before sigsuspend() — pending signals: \n");

if (sigsuspend(&origMask) == –1 && errno!= EINTR)

errExit("sigsuspend");

}


if (sigprocmask(SIG_SETMASK, &origMask, NULL) == –1)

errExit("sigprocmask — SIG_SETMASK");

printSigMask(stdout, "=== Exited loop\nRestored signal mask to: \n");


/* Выполнение других команд… */


exit(EXIT_SUCCESS);

}

signals/t_sigsuspend.c

Следующий журнал сессии оболочки показывает пример того, что мы можем увидеть на экране при запуске программы из листинга 22.5:

$ ./t_sigsuspend

Initial signal mask is:

=== LOOP 1

Starting critical section, signal mask is:

2 (Interrupt)

3 (Quit)

Нажмите Ctrl+C; SIGINT сгенерирован, но остается в режиме ожидания, так как заблокирован

Before sigsuspend() — pending signals:

2 (Interrupt)

Caught signal 2 (Interrupt) Вызов sigsuspend(), сигналы разблокированы

Последняя строка вывода появилась на экране, когда программа вызвала функцию sigsuspend(), разблокировавшую сигнал SIGINT. В этот момент был вызван обработчик, отобразивший эту строку.

Основная программа продолжает цикл:

=== LOOP 2

Starting critical section, signal mask is:

2 (Interrupt)

3 (Quit)

Нажмите Ctrl+\ для генерации SIGQUIT

Before sigsuspend() — pending signals:

3 (Quit)

Caught signal 3 (Quit) Вызов sigsuspend(), сигналы разблокированы

=== Exited loop Обработчик сигнала установил gotSigquit

Restored signal mask to:

В этот раз мы нажали сочетание выхода Ctrl+\, заставившее обработчик сигнала установить флаг gotSigquit, который, в свою очередь, заставил программу завершить цикл.


22.10. Синхронное ожидание сигнала


В разделе 22.9 мы увидели, как использовать обработчик сигнала вместе с функцией sigsuspend() для приостановки выполнения процесса до того, как будет доставлен сигнал. Однако необходимость написания обработчика сигнала и обработки сложностей асинхронной доставки делает некоторые приложения громоздкими. Вместо этого мы можем использовать системный вызов sigwaitinfo() для реализации синхронного приема сигнала.

Функция sigwaitinfo() приостанавливает выполнение процесса до тех пор, пока из набора, указываемого аргументом set, не будет ожидать по крайней мере один сигнал. Если в наборе set один сигнал уже находится в режиме ожидания во время вызова, тогда функция sigwaitinfo() выполняет возврат незамедлительно. Этот сигнал удаляется из списка ожидания, а его номер возвращается как результат выполнения функции. Если значение info не равно NULL, то данный аргумент указывает на структуру siginfo_t, инициализацируемую для хранения той же самой информации, что и предоставляется обработчику сигнала через аргумент siginfo_t (см. раздел 21.4).

#define _POSIX_C_SOURCE 199309

#include


int sigwaitinfo(const sigset_t *set, siginfo_t *info);

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

Очередность доставки и характеристики очереди сигналов, принимаемых функцией sigwaitinfo(), аналогичны свойствам сигналов, перехватываемых обработчиками. Иными словами, стандартные сигналы не ставятся в очередь, тогда как сигналы реального времени ставятся в очередь и доставляются по возрастанию номера сигнала.

Ожидание сигналов с использованием функции sigwaitinfo() не только избавляет от лишнего кода при написании обработчиков сигналов, но и является несколько более быстрым решением по сравнению с сочетанием «обработчик сигнала + функция sigsuspend()» (см. упражнение 22.3).

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

Согласно стандарту SUSv3 вызов sigwaitinfo() без блокировки сигналов, указанных в аргументе set, приводит к неопределенному поведению. Пример использования функции sigwaitinfo() приведен в листинге 22.6. Эта программа сначала блокирует все сигналы, а затем делает отсрочку на количество секунд, указанное в необязательном аргументе командной строки. Это позволяет отправлять сигналы в программу перед вызовом sigwaitinfo(). Затем программа выполняет цикл с sigwaitinfo() до тех пор, пока не получит сигнал SIGINT или SIGTERM.

Следующий журнал сессии оболочки демонстрирует выполнение программы из листинга 22.6. Мы запускаем программу в фоновом режиме, указываем, что она должна сделать отсрочку на 60 секунд перед вызовом sigwaitinfo(), а затем отправляем в нее два сигнала:

$ ./t_sigwaitinfo 60 &

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

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

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

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

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