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

Так как прототип вышеприведенного обработчика сигнала отличается от прототипа стандартного обработчика, правила типов языка С не позволяют нам задействовать поле sa_handler структуры sigaction для указания адреса этого обработчика. По этой причине мы вынуждены использовать альтернативное поле: sa_sigaction. Иными словами, определение структуры sigaction несколько более сложно, чем было показано в разделе 20.13. Полностью определение этой структуры выглядит следующим образом:

struct sigaction {

union {

void (*sa_handler)(int);

void (*sa_sigaction)(int, siginfo_t *, void *);

} __sigaction_handler;

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer)(void);

};

/* Благодаря следующим строкам define поля union выглядят

как простые поля родительской структуры */

#define sa_handler __sigaction_handler.sa_handler

#define sa_sigaction __sigaction_handler.sa_sigaction

В структуре sigaction используется объединение для сочленения полей sa_sigaction и sa_handler. (В большинстве реализаций UNIX объединение применяется для аналогичных целей.) Объединение возможно, потому что при осуществлении каждого конкретного вызова функции sigaction() требуется только одно из этих полей. (Попытка независимо друг от друга установить значения полей sa_sigaction и sa_handler может привести к ошибкам, возможно, из-за того, что мы повторно используем одну и ту же структуру sigaction для нескольких вызовов функции sigaction(), чтобы установить обработчики различных сигналов.)

Далее приведен пример задействования флага SA_SIGINFO для установки одного обработчика:

struct sigaction act;


sigemptyset(&act.sa_mask);

act.sa_sigaction = handler;

act.sa_flags = SA_SIGINFO;


if (sigaction(SIGINT, &act, NULL) == –1)

errExit("sigaction");

Для ознакомления с завершенными примерами использования флага SA_SIGINFO см. листинги 22.3 и 23.5.


Структура siginfo_t

Структура siginfo_t, которая передается в качестве второго аргумента обработчику сигнала, установленного с помощью флага SA_SIGINFO, имеет такой вид:

typedef struct {

int si_signo; /* Номер сигнала */

int si_code; /* Код сигнала */

int si_trapno; /* Номер ловушки для аппаратно генерируемого сигнала

(не используется в большинстве архитектур) */

union sigval si_value; /* Дополнительные данные из sigqueue() */

pid_t si_pid; /* ID посылающего процесса */

uid_t si_uid; /* Реальный ID пользователя

посылающего процесса */

int si_errno; /* Номер ошибки (обычно не используется) */

void *si_addr; /* Адрес, сгенерировавший сигнал (только

для аппаратно-генерируемых сигналов) */

int si_overrun; /* Счетчик переполнений таймера

(Linux 2.6, таймеры POSIX) */

int si_timerid; /* (Внутриядерный) ID таймера

(Linux 2.6, таймеры POSIX) */

long si_band; /* Связывающее событие (SIGPOLL/SIGIO) */

int si_fd; /* Файловый дескриптор (SIGPOLL/SIGIO) */

int si_status; /* Код завершения или сигнал (SIGCHLD) */

clock_t si_utime; /* Пользовательское время ЦП (SIGCHLD) */

clock_t si_stime; /* Системное время ЦП (SIGCHLD) */

} siginfo_t;

Макрос тестирования возможности _POSIX_C_SOURCE должен быть определен со значением, большим или равным 199309, чтобы объявление структуры siginfo_t было доступно из файла .

В Linux, как и в большинстве реализаций UNIX, многие поля структуры siginfo_t объединены, так как не все поля нужны для каждого сигнала. (См. для получения более подробной информации.)

На входе в обработчик сигнала поля структуры siginfo_t установлены следующим образом.

• si_signo — устанавливается для всех сигналов. Поле содержит номер сигнала, вызвавшего активацию обработчика, то есть то же самое значение, что и аргумент sig обработчика.

• si_code — устанавливается для всех сигналов. Содержит код, предоставляющий дополнительную информацию об источнике сигнала, как показано в табл. 21.2.

• si_value — содержит дополнительные данные, отправляемые в сигнал с помощью функции sigqueue(). Функция sigqueue() описывается в подразделе 22.8.1.

• si_pid — для сигналов, отправляемых через функцию kill() или siqueue(), это поле содержит идентификатор пославшего сигнал процесса.

• si_uid — для сигналов, отправляемых через функцию kill() или siqueue(), это поле содержит реальный ID пользователя процесса, пославшего сигнал. Система предоставляет реальный ID пользователя процесса, так как он является более информативным по сравнению с действующим ID пользователя. Рассмотрим права доступа для отправки сигналов, описанные в разделе 20.5: если действующий ID пользователя дает отправителю право послать сигнал, значит, он должно быть равен 0 (то есть привилегированный процесс) или совпадать с реальным или сохраненным установленным ID пользователя процесса, получающего сигнал. В этом случае получателю было бы полезно знать реальный ID пользователя отправителя, которое может отличаться от действующего ID пользователя (если отправитель — это программа с установленным ID пользователя).

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

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

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

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

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