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

• Мультиплицирующие вызовы ввода-вывода poll(), ppoll(), select() и pselect(). (В стандарте SUSv3 явно указывается, что поведение вызовов select() и pselect() в случае прерывания обработчиком сигнала не устанавливается вне зависимости от флага SA_RESTART).

• Специфичные системные вызовы Linux epoll_wait() и epoll_pwait().

• Специфичный системный вызов Linux io_getevents().

• Блокирующие системные вызовы, использовавшиеся с очередями сообщений и семафорами System V: semop(), semtimedop(), msgrcv() и msgsnd(). (Несмотря на то что изначально в System V не был реализован автоматический перезапуск системных вызовов, в некоторых реализациях UNIX эти системные вызовы перезапускаются при установке флага SA_RESTART.)

• Вызов read() из файлового дескриптора inotify.

• Системные вызовы и библиотечные функции, созданные специально для ожидания доставки сигнала: pause(), sigsuspend(), sigtimedwait() и sigwaitinfo().


Изменение флага SA_RESTART сигнала

Функция siginterrupt() изменяет установку SA_RESTART конкретного сигнала.

#include


int siginterrupt(int sig, int flag);

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

Если параметр flag истинен (1), значит, обработчик сигнала sig будет прерывать блокирующие системные вызовы. Если flag ложен (0), то блокирующие системные вызовы будут перезапущены после выполнения обработчика сигнала sig.

Функция siginterrupt() в своей работе использует функцию sigaction() для получения копии текущей диспозиции сигнала, изменяет значение флага SA_RESTART, возвращаемого структурой oldact, а затем вызывает функцию sigaction() еще раз, чтобы обновить диспозицию сигнала.

В стандарте SUSv4 функция siginterrupt() помечена как устаревшая с рекомендацией использовать для этих целей функцию sigaction().


Необрабатываемые сигналы остановки могут сгенерировать ошибку EINTR для некоторых системных вызовов Linux

В Linux некоторые блокирующие системные вызовы могут возвращать ошибку EINTR даже при отсутствии обработчика сигнала. Это может случиться, если системный вызов заблокирован и процесс сначала остановлен сигналом (SIGSTOP, SIGTSTP, SIGTTIN и SIGTTOU), а затем возобновлен сигналом SIGCONT.

Так ведут себя следующие системные вызовы: epoll_pwait(), epoll_wait(), read() из файлового дескриптора inotify, semop(), semtimedop(), sigtimedwait() и sigwaitinfo().

В ядрах, предшествовавших версии 2.6.24, так вел себя вызов poll(), в ядрах старше версии 2.6.22 — вызовы sem_wait(), sem_timedwait(), futex(FUTEX_WAIT), вызовы msgrcv(), msgsnd() в ядрах до 2.6.9 и nanosleep() в Linux 2.4 и более ранних.

В Linux 2.4 и более ранних версиях вызов sleep() также мог быть прерван подобным образом, но вместо возврата ошибки он возвращал количество оставшихся секунд сна.

Результатом такого поведения является то, что если существует вероятность того, что наша программа может быть остановлена и перезапущена сигналами, значит, нам может потребоваться включить в нее программный код для перезапуска вышеперечисленных системных вызовов, даже если в программе не устанавливаются обработчики сигналов остановки.


21.6. Резюме


В этой главе мы рассмотрели целый набор факторов, влияющих на работу и проектирование обработчиков сигналов.

Так как сигналы не ставятся в очередь, обработчики сигналов должны иногда быть запрограммированы таким образом, чтобы они могли справляться с вероятностью одновременного свершения нескольких событий одного конкретного типа, даже если получателю доставлен только один сигнал. Проблемы реентерабельности влияют на то, каким образом мы обновляем глобальные переменные, и ограничивают набор функций, которые мы можем безопасно вызывать из обработчиков сигналов.

Кроме выполнения возврата управления, обработчик сигнала может быть завершен одним из нескольких способов, в том числе вызов функции _exit(), путем отправки сигнала (kill(), raise() или abort()) либо выполнения нелокального перехода. Использование функций sigsetjmp() и siglongjmp() предоставляет программе явный контроль над обработкой сигнальной маски процесса при выполнении нелокального перехода.

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

Флаг SA_SIGINFO функции sigaction() позволяет установить обработчик сигнала, получающий дополнительную информацию о сигнале. Эта информация предоставляется через структуру siginfo_t, адрес которой передается обработчику сигнала в качестве аргумента.

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

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

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

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

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