Linux что такое sig
Известно три варианта реакции на сигналы:
- вызов собственной функции обработки;
- игнорирование сигнала (не работает для SIGKILL );
- использование предварительно установленной функции обработки по умолчанию.
void(*signal(int signr, void(*sighandler)(int)))(int); Такой прототип очень сложен для понимания. Следует упростить его, определив тип для функции обработки:
typedef void signalfunction(int); После этого прототип функции примет вид: signalfunction *signal(int signr,
signalfunction *sighandler); signr устанавливает номер сигнала, для которого устанавливается обработчик. В заголовочном файле определены следующие сигналы (табл. 1).
| Номер | Значение | Реакция программы по умолчанию |
| SIGABRT | Ненормальное завершение (abort()) | Завершение |
| SIGALRM | Окончание кванта времени | Завершение |
| SIGBUS | Аппаратная ошибка | Завершение |
| SIGCHLD | Изменение состояния потомка | Игнорирование |
| SIGCONT | Продолжение прерванной программы | Продолжение / игнорирование |
| SIGEMT | Аппаратная ошибка | Завершение |
| SIGFPE | Ошибка вычислений с плавающей запятой | Завершение |
| SIGILL | Неразрешенная аппаратная команда | Завершение |
| SIGINT | Прерывание с терминала | Завершение |
| SIGIO | Асинхронный ввод/вывод | Игнорирование |
| SIGKILL | Завершение программы | Завершение |
| SIGPIPE | Запись в канал без чтения | Завершение |
| SIGPWR | Сбой питания | Игнорирование |
| SIGQUIT | Прерывание с клавиатуры | Завершение |
| SIGSEGV | Ошибка адресации | Завершение |
| SIGSTOP | Остановка процесса | Остановка |
| SIGTTIN | Попытка чтения из фонового процесса | Остановка |
| SIGTTOU | Попытка записи в фоновый процесс | Остановка |
| SIGUSR1 | Пользовательский сигнал | Завершение |
| SIGUSR2 | Пользовательский сигнал | Завершение |
| SIGXCPU | Превышение лимита времени CPU | Завершение |
| SIGXFSZ | Превышение пространства памяти (4GB) | Завершение |
| SIGURG | Срочное событие | Игнорирование |
| SIGWINCH | Изменение размера окна | Игнорирование |
Переменная sighandler определяет функцию обработки сигнала. В заголовочном файле определены две константы SIG_DFL и SIG_IGN . SIG_DFL означает выполнение действий по умолчанию — в большинстве случаев — окончание процесса. Например, определение signal(SIGINT, SIG_DFL); приведет к тому, что при нажатии на комбинацию клавиш CTRL+C во время выполнения сработает реакция по умолчанию на сигнал SIGINT и программа завершится. С другой стороны, можно определить
signal(SIGINT, SIG_IGN);
Если теперь нажать на комбинацию клавиш CTRL+C , ничего не произойдет, так как сигнал SIGINT игнорируется. Третьим способом является перехват сигнала SIGINT и передача управления на адрес собственной функции, которая должна выполнять действия, если была нажата комбинация клавиш CTRL+C , например
signal(SIGINT, function);
Пример использования обработчика сигнала приведен ниже: #include
printf(«\nХотите завершить программу (y/n) : «);