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) : «);