WikiDer > Sigaction

Sigaction

В вычислениях подписание это 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);	}}

Рекомендации

внешняя ссылка