Сигналы межпроцессного взаимодействияСигна́лы межпроцессного взаимодействия — являются сообщениями, которые операционная система посылает процессу, или один процесс посылает другому. С точки зрения пользователя получение процессом сигнала выглядит как возникновение исключительной ситуации (прерывания). Когда процесс получает сигнал, выполнение программы процесса прерывается, и управление передается на подпрограмму (функцию) — обработчик сигнала. После выполнения обработчика сигнала выполнение прерванной программы возобновляется с той точки, на которой она была прервана.[1][2] Типы сигналовТипы сигналов задаются числовыми номерами, но при программировании для них обычно используют символьные имена (константы), определённые в системных включаемых файлах. В операционной системе предусмотрено большое число типов сигналов, но большинство из этих типов зарезервировано для системных целей — это сигналы, которые операционная система посылает процессу. Однако есть и сигналы, которыми процессы могут обмениваться между собой. В рамках полномочий пользователя процесс может послать сигнал любому другому процессу, PID которого ему известен, при помощи системного вызова kill (несмотря на грозное название, этот системный вызов не обязательно убивает тот процесс, которому он адресован). #include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signal);
Аргумент pid указывает процесс, которому посылается сигнал, а аргумент signal — какой сигнал посылается.
Установка собственных обработчиков сигналовДля установки своего обработчика сигнала, для его отмены или для установки игнорирования сигнала используется системный вызов signal. # include <signal.h>
void (*signal (int sig, void (*handler) (int)))(int);
Параметр sig — это номер сигнала, обработку которого предстоит изменить. Параметр handler описывает новый способ обработки сигнала — это может быть указатель на пользовательскую функцию-обработчик сигнала, специальное значение SIG_DFL (восстановить реакцию процесса на сигнал sig по умолчанию) или специальное значение SIG_IGN (игнорировать поступивший сигнал sig). Системный вызов возвращает указатель на старый способ обработки сигнала, значение которого можно использовать для восстановления старого способа в случае необходимости. Обработчик сигнала в процессе имеет вид функции с прототипом: void имя_функции(int sigtype); Параметром данной функции является тип сигнала (один и тот же обработчик может быть установлен для обработки сигналов разных типов). Пример пользовательской обработки сигнала SIGUSR1. void *my_handler(int nsig) { код функции-обработчика сигнала } int main() { (void) signal(SIGUSR1, my_handler); } ОС в которых можно использовать сигналыСигналы можно использовать во всех Unix системах таких как BSD, FreeBSD, GNU и т. д. В windows есть небольшой аналог, функция signal() из CRT, из сигналов которой по сути только SIGINT можно использовать по назначению. Примечания
Ссылки |
Portal di Ensiklopedia Dunia