
Из АПУЭ
У процесса есть три варианта обработки сигнала.
Игнорировать сигнал. Этот параметр не рекомендуется для сигналов, которые обозначают аппаратное исключение, например деление на ноль или обращение к памяти за пределами адресного пространства процесса, поскольку результаты не определены.
Пусть произойдет действие по умолчанию. Для условия деления на ноль по умолчанию выполняется завершение процесса.
Предоставьте функцию, которая вызывается при возникновении сигнала (это называется «перехват» сигнала). Предоставляя собственную функцию, мы узнаем, когда возникает сигнал, и сможем обрабатывать его по своему усмотрению.
Я думаю, что есть только два варианта — последние два из перечисленных выше, и оба они могут «игнорировать сигнал» (первый вариант из перечисленных выше).
Правильно ли я понимаю, или действительно есть три непересекающихся варианта, как в цитате? Почему?
В книге упоминается, что действие по умолчанию некоторого сигнала — игнорировать его. Означает ли это, что действие сигнала — SIG_IGN или SIG_DFL или пустая функция? Например:
Theпо умолчаниюдействие для SIGCHLD должно бытьпроигнорировано. Мы описываем эти варианты в Главе 10.
SIGCONT: по умолчанию действие заключается в продолжении остановленного процесса, но игнорироватьсигнал, если процесс не был остановлен.
Спасибо.
решение1
Конечно, можно написать обработчик сигнала, который ничего не делает и, таким образом, фактически игнорирует сигнал, но первый вариант — специально игнорировать сигнал, используя аргумент SIG_IGN
системного signal()
вызова.
Итак, с точки зрения кода, при наличии SIGINT
сигнала, возможны три варианта:
signal(SIGINT, SIG_IGN);
игнорировать- Не вызывать
signal()
функцию или вызвать ее с помощьюsignal(SIGINT, SIG_DFL);
и таким образом позволить произойти действию по умолчанию, т.е. завершить процесс signal(SIGINT, termination_handler);
, гдеtermination_handler()
— функция, которая вызывается при первом появлении сигнала.
Источник:https://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html
Для конкретного случая сигналов, где действие по умолчанию — игнорировать сигнал, первые два варианта ( SIG_IGN
и SIG_DFL
) идентичны. Создание пустой функции-обработчика, вероятно, не даст видимого эффекта, кроме (небольших) накладных расходов.
ПРИМЕЧАНИЕ: signal()
в этом ответе для простоты используется , но в новом коде sigaction()
рекомендуется из соображений переносимости.