|
SIGSET(2)НАЗВАНИЕ СИНТАКСИС #include <signal.h> void (*sigset(sig,func))() int sig; void (*func)(); int sighold(sig) int sig; int sigrelse(sig) int sig; int sigignore(sig) int sig; int sigpause(sig) int sig; ОПИСАНИЕ Параметру sig может быть присвоено любое из приведенных значений, за исключением значения SIGKILL. Сигналы, зависящие от аппаратной или программной реализации, не приведены (см. "Примечания" ниже). Каждое значение sig является макросом, определенным в файле <signal.h> и который может быть представлен в виде выражения-константы.
В отношении звездочек (*) в вышеприведенном списке смотрите текст под SIG_DFL. Следующие значения для определенных системой действий func также определяются в файле <signal.h>. Каждое из них является макросом, который может быть представлен в виде выражения-константы типа указателя на функцию, возвращающую void, и имеет уникальное значение, которое не соответствует ни одной определенной функции.
В любом другом случае func должен быть указателем на функцию-обработчик, которая вызывается при возникновении сигнала sig. В этом случае sigset определяет, что процесс должен вызвать эту функцию по получении сигнала sig. Любой ожидаемый сигнал этого типа сбрасывается. Адрес данного обработчика поддерживается длявсех вызовов прочих функций управления сигналами, перечисленными здесь. При возникновении сигнала его значение sig передается обработчику в качестве единственного аргумента. Перед вызовом обработчика реакция системы на сигнал устанавливается на SIG_HOLD. При нормальном возврате из обработчика реакция системы на сигнал восстанавливается на func, и любой ожидаемый сигнал этого типа сбрасывается.Если выполняется нелокальный переход goto(longjmp - дальний прыжок), тодля восстановления реакции системы на сигнал и сброса любого удерживаемого сигнала данного типа должен быть вызван sigrelse. В принципе после возврата из обработчика сигнала процесс, получивший этот сигнал, должен возобновить свое выполнение в точке, где он был прерван. Однако, если сигнал ловится во время системных вызовов read(2), write(2), open(2) или ioctl(2), когда работает системный вызов sigpause или wait(2), которые задерживают возврат из-за наличия предварительно приостановленного процесса (или зомби-процесса), то будет выполняться обработчик сигнала, после чего прерванный системный вызов может возвратить вызывавшему процессу -1 со значением errno, установленным в EINTR. sighold и sigrelse используются для установления критических областей кода. sighold соответствует поднятию уровня приоритета и удержанию сигнала, пока этот приоритет не будет снижен с помощью sigrelse. sigrelse восстанавливает реакцию системы на сигнал в предварительно заданную с помощью sigset. sigignore устанавливает реакцию на сигнал sig в SIG_IGN (см. выше). sigpause приостанавливает вызывающий процесс, пока он не получит сигнал; аналогично работает pause(2).Однако, при получениии удержании сигнала sig, он сбрасывается, и активизируется системная реакция на этот сигнал. Этот системный вызов полезен для проверки переменных, которые меняют свое значение при возникновении сигнала. При этом правильные действия таковы: вначале sighold используется для блокировки сигнала, затем проверяются переменные. Если онине изменились, то вызывается sigpause для ожидания сигнала. Вызов sigset потерпит крах, если выполнится одно из следующих условий:
СМ. ТАКЖЕ ДИАГНОСТИКА Что касается других функций,то при их успешном выполнении возвращается значение 0. В противном случае возвращается значение -1, а errno указывает на ошибку. Примечания В целях компактности прикладные программы должны использовать только символические имена сигналов, а не их значения, и применять только те сигналы, которые перечислены здесь. Реакция на сигнал SIGKILL по умолчанию не может быть изменена. Специальные разработки могут определять собственные сигналы, а обработчику сигналов могут быть переданы дополнительные определенные в разработке аргументы, соответствующие аппаратным сигналам. В случае некоторых аппаратно генерируемых сигналов может оказаться невозможным возобновление выполнения процессов в точке их прерывания. Сигнальный тип SIGSEGV резервируется на случай некорректного доступа к информационному объекту. Если разрабатываемая программа в состоянии определить возникновение подобного состояния, то следует использовать этот сигнальный тип. Другие функции управления сигналами, signal(2) и pause(2), не следует использовать в соединении с приведенными функциями для обработки специфических типов сигналов. |
|