int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
int sigpending(sigset_t *set);
int sigsuspend(const sigset_t *mask);
Параметр signum задает номер сигнала и может быть равен любому номеру, кроме SIGKILL и SIGSTOP.
Если параметр act не равен нулю, то новое действие, связянное с сигналом signum, устанавливается соответственно act. Если oldact не равен нулю, то предыдущее действие записывается в oldact.
Структура sigaction имеет следующий формат:
struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); }
В некоторых архитектурах используется объединение элементов, но не используйте sa_handler и sa_sigaction вместе.
Элемент sa_restorer устарел, поэтому не должен использоваться. POSIX не описывает элемент sa_restorer.
sa_handler задает тип действий процесса, связанный с сигналом signum, и может быть равен: SIG_DFL для выполнения стандартных действий, SIG_IGN для игнорирования сигнала,- или быть указателем на функцию обработки сигнала.
sa_mask задает маску сигналов, которые должны блокироваться при обработке сигнала. Также будет блокироваться и сигнал, вызвавший запуск функции, если только не были использованы флаги SA_NODEFER или SA_NOMASK.
sa_flags содержит набор флагов, которые могут влиять на поведение процесса при обработке сигнала. Он состоит из следующих флагов:
Параметр siginfo_t поля sa_sigaction является структурой, состоящей из следующих элементов:
siginfo_t { int si_signo; /* Номер сигнала */ int si_errno; /* Значение errno */ int si_code; /* Код сигнала */ pid_t si_pid; /* Идентификатор процесса, пославшего сигнал */ uid_t si_uid; /* Реальный идентификатор пользователя процесса, пославшего сигнал */ int si_status; /* Выходное значение или номер сигнала */ clock_t si_utime; /* Занятое пользователем время */ clock_t si_stime; /* Использованное системное время */ sigval_t si_value; /* Значение сигнала */ int si_int; /* Сигнал POSIX.1b */ void * si_ptr; /* Сигнал POSIX.1b */ void * si_addr; /* Адрес в памяти, приводящий к ошибке */ int si_band; /* Общее событие */ int si_fd; /* Описатель файла */ }
si_code | |
Значение | Причина сигнала |
SI_USER | kill, sigsend или raise |
SI_KERNEL | ядро |
SI_QUEUE | sigqueue |
SI_TIMER | истекло время таймера |
SI_MESGQ | изменилось состояние mesq |
SI_ASYNCIO | завершился AIO |
SI_SIGIO | SIGIO помещен в очередь |
SIGILL | |
ILL_ILLOPC | некорректный код инструкции |
ILL_ILLOPN | неверный операнд |
ILL_ILLADR | некорректный режим адресации |
ILL_ILLTRP | некорректная ловушка |
ILL_PRVOPC | привилегированная операция |
ILL_PRVREG | привилегированный регистр |
ILL_COPROC | ошибка сопроцессора |
ILL_BADSTK | внутренняя ошибка стека |
SIGFPE | |
FPE_INTDIV | деление на ноль при работе с целыми числами |
FPE_INTOVF | переполнение при работе с целыми числами |
FPE_FLTDIV | деление на ноль при работе с числами с плавающей запятой |
FPE_FLTOVF | переполнение при работе с числами с плавающей запятой |
FPE_FLTUND | нехватка значения при работе с числами с плавающей запятой |
FPE_FLTRES | неточный результат при работе с числами с плавающей запятой |
FPE_FLTINV | неправильная операция при работе с числами с плавающей запятой |
FPE_FLTSUB | индекс вне разрешенных пределов при работе с числами с плавающей запятой |
SIGSEGV | |
SEGV_MAPERR | адрес не соответствует объекту |
SEGV_ACCERR | права на отраженный объект неправильны |
SIGBUS | |
BUS_ADRALN | неправильное выравнивание адреса |
BUS_ADRERR | несуществующий физический адрес |
BUS_OBJERR | аппаратная ошибка, специфичная для объекта |
SIGTRAP | |
TRAP_BRKPT | точка остановки процесса |
TRAP_TRACE | ловушка отладки процесса |
SIGCHLD | |
CLD_EXITED | дочерний процесс завершил работу |
CLD_KILLED | работа дочернего процесса была прервана |
CLD_DUMPED | дочерний процесс завершился некорректно |
CLD_TRAPPED | сработала ловушка в отлаживаемом дочернем процессе |
CLD_STOPPED | дочерний процесс остановлен |
CLD_CONTINUED | остановленный дочерний процесс продолжил работу |
SIGPOLL | |
POLL_IN | есть входные данные |
POLL_OUT | освободились выходные буферы |
POLL_MSG | есть входное сообщение |
POLL_ERR | ошибка ввода/вывода |
POLL_PRI | есть входные данные высокого приоритета |
POLL_HUP | устройство отключено |
Системный вызов sigprocmask используется для того, чтобы изменить список блокированных в данный момент сигналов. Работа этой функции зависит от значения параметра how следующим образом:
Если значение поля oldset не равно нулю, то предыдущее значение маски сигналов записывается в oldset.
Системный вызов sigpending позволяет определить наличие ожидающих сигналов (полученных заблокированных сигналов). Маска ожидающих сигналов помещается в set.
Системный вызов sigsuspend временно изменяет значение маски блокировки сигналов процесса на указанное в mask, и затем приостанавливает работу процесса до получения соответствующего сигнала.
В соответствии с POSIX поведение процесса после игнорирования сигнала SIGFPE, SIGILL или SIGSEGV не определено, если эти сигналы не были посланы при помощи функций kill() или raise(). Деление целого числа на ноль имеет непредсказуемый результат. В некоторых архитектурах это приводит к появлению сигнала SIGFPE. (Более того, деление самого большого по модулю отрицательного числа на -1 приведет к появлению SIGFPE.) Игнорирование этого сигнала может привести к появлению бесконечного цикла.
POSIX (B.3.3.1.3) запрещает установку действия для сигнала SIGCHLD на SIG_IGN. Поведение BSD и SYSV в этом случае различается. Это приводит к тому, что BSD-программы, определяющие поведение SIGCHLD в SIG_IGN, в Linux не работают.
Специфические черты POSIX определяют только SA_NOCLDSTOP. Использование других флагов в sa_flags может быть неэффективно в других системах.
Флаг SA_RESETHAND совместим с одноименным флагом SVr4.
Флаг SA_NODEFER совместим с одноименным флагом SVr4 в ядре версии 1.3.9 и более поздних. В старых выпусках ядра Linux позволяли принимать и обрабатывать любые сигналы, а не только те, обработка которых уже задана (на деле это приводит к игнорированию установок sa_mask).
Названия флагов SA_RESETHAND и SA_NODEFER, необходимые для совместимости с SVr4, присутствуют в библиотеках версии 3.0.9 и более поздних.
Флаг SA_SIGINFO описан в POSIX.1b. Его поддержка была добавлена в Linux 2.2.
Функция sigaction со вторым нулевым аргументом может быть вызвана для того, чтобы получить адрес текущего обработчика прерываний. Эту функцию можно также использовать для проверки правильности этого типа сигнала в конкретной системе, вызвав ее с нулевыми вторым и третьим параметрами.
Подробная информация о работе с наборами сигналов есть на странице sigsetops(3).
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |