WikiDer > Sigaction
Эта статья в значительной степени или полностью полагается на один источник. (Февраль 2010 г.) |
Тема этой статьи может не соответствовать Википедии общее руководство по известности. (Август 2020 г.) (Узнайте, как и когда удалить этот шаблон сообщения) |
В вычислениях подписание
это API функции, определяемый POSIX чтобы дать программисту доступ к тому, каким должно быть поведение программы при получении конкретной ОС сигналы.
Общий
В Unix-подобный операционных систем, одно из средств межпроцессного взаимодействия через сигналы. Когда исполняющий блок (процесс или же нить) получает сигнал от ОС, он должен каким-то образом отреагировать, определенным таблицей данных и общепринятым значением этого сигнала (то есть сбрасывая свои данные, останавливая выполнение, синхронизируя что-то ...).
В sigaction ()
Системный вызов используется для объявления поведения программы, если она получит один конкретный сигнал, не зарезервированный системой. Это делается путем предоставления вместе с системным вызовом структуры, содержащей, среди прочего, указатель функции на процедуру обработки сигнала. Некоторые предопределенные сигналы (например, СИГКИЛЛ
) имеют заблокированное поведение, которое обрабатывается системой и не может быть отменено такими системными вызовами.
структура сделки
Стандарт POSIX требует, чтобы структура sigaction была определена, как показано ниже, в файле заголовка
структура подписание { пустота (*sa_handler)(int); / * адрес обработчика сигнала * / sigset_t sa_mask; / * дополнительные сигналы для блокировки * / int sa_flags; / * параметры сигнала * / / * альтернативный обработчик сигнала * / пустота (*sa_sigaction)(int, siginfo_t *, пустота*);};
Реализации могут определять дополнительные, возможно, непереносимые поля. Член sa_handler указывает адрес функции, которая должна быть вызвана, когда процесс получает сигнал. Номер сигнала передается в эту функцию как целочисленный аргумент. Член sa_mask указывает дополнительные сигналы, которые должны быть заблокированы во время выполнения обработчика сигналов. sa_mask необходимо инициализировать с помощью sigemptyset (3). Член sa_flags определяет некоторые дополнительные флаги. sa_sigaction - это альтернативный обработчик сигналов с другим набором параметров. Должен быть указан только один обработчик сигнала: sa_handler или sa_sigaction. Если желательно использовать sa_sigaction вместо sa_handler, необходимо установить флаг SA_SIGINFO.
Замена устаревшего сигнал ()
В sigaction ()
функция предоставляет интерфейс для надежных сигналов вместо ненадежных и устаревших сигнал ()
функция. Обработчики сигналов, установленные сигнал ()
интерфейс будет удален непосредственно перед запуском обработчика. Поэтому постоянные обработчики необходимо переустановить, позвонив в сигнал ()
во время выполнения обработчика, вызывая ненадежность в случае получения сигнала того же типа во время выполнения обработчика, но до переустановки. Обработчики, установленные sigaction ()
интерфейс может быть установлен постоянно, а пользовательский набор сигналов может быть заблокирован во время выполнения обработчика. Эти сигналы будут разблокированы сразу после нормального завершения работы обработчика (но не в случае аварийного завершения, такого как выброс исключения C ++).
Использование в C ++
В C ++ попробуй поймать {/* ... */}
структура программирования может быть (в зависимости от хост-платформ) на основе сигнализации. К ловить
сигналов, переведенных в исключения C ++, на некоторых платформах могут потребоваться специальные переключатели компилятора, например -fnon-call-исключения
за GCC и компилятор Intel C.[1]
Пример
#включают <stdio.h>#включают <stdlib.h>#включают <string.h>#включают <unistd.h>#включают <sys/wait.h>#включают <signal.h>#define NUMCHLDS 10пустота sigchld_handler(int, siginfo_t*, пустота*);sig_atomic_t nexitedchlds = 0;intглавный(int argc, char *argv[]){ структура подписание действовать; memset(&действовать, 0, размер(структура подписание)); sigemptyset(&действовать.sa_mask); действовать.sa_sigaction = sigchld_handler; действовать.sa_flags = SA_SIGINFO; если (-1 == подписание(SIGCHLD, &действовать, НОЛЬ)) { перрор("sigaction ()"); выход(EXIT_FAILURE); } за (int я = 0; я < NUMCHLDS; я++) { выключатель(вилка()) { дело 0: /* * Старые реализации ОС, которые неправильно реализуют * структура siginfo обрезает код выхода * маскируя его с помощью 0xFF. */ возвращаться 1234567890; / * НЕ ДОСТУПЕН * / дело -1: записывать(STDERR_FILENO, "ОШИБКА вилки!", 11); выход(EXIT_FAILURE); / * НЕ ДОСТУПЕН * / дефолт: printf("Дитя создано п"); } } пока (1) { если (nexitedchlds < NUMCHLDS) Пауза(); еще выход(EXIT_SUCCESS); } / * НЕ ДОСТУПЕН * / возвращаться 0;}пустотаsigchld_handler(int Signo, siginfo_t *sinfo, пустота *контекст){ pid_t proc; пока ((proc = waitpid(-1, НОЛЬ, WNOHANG)) > 0) { / * основной поток сигнала * / nexitedchlds++; /* * Примечание: printf () небезопасен для сигналов!* не используйте его в обработчике сигналов. * si_code - это полный 32-битный код выхода дочернего объекта (см. также waitid ()). */ printf("sinfo-> si_pid =% ld пproc =% ld пкод выхода% d причина выхода% d п", (длинный)sinfo->вкусный, (длинный)proc, sinfo->si_status, sinfo->si_code); }}
Рекомендации
внешняя ссылка
- Единая спецификация UNIX, Выпуск 7 из Открытая группа : проверить и изменить действие сигнала - Справочник по системным интерфейсам,