Варианты обработки сигнала?

Варианты обработки сигнала?

Из АПУЭ

У процесса есть три варианта обработки сигнала.

  1. Игнорировать сигнал. Этот параметр не рекомендуется для сигналов, которые обозначают аппаратное исключение, например деление на ноль или обращение к памяти за пределами адресного пространства процесса, поскольку результаты не определены.

  2. Пусть произойдет действие по умолчанию. Для условия деления на ноль по умолчанию выполняется завершение процесса.

  3. Предоставьте функцию, которая вызывается при возникновении сигнала (это называется «перехват» сигнала). Предоставляя собственную функцию, мы узнаем, когда возникает сигнал, и сможем обрабатывать его по своему усмотрению.

  1. Я думаю, что есть только два варианта — последние два из перечисленных выше, и оба они могут «игнорировать сигнал» (первый вариант из перечисленных выше).

    Правильно ли я понимаю, или действительно есть три непересекающихся варианта, как в цитате? Почему?

  2. В книге упоминается, что действие по умолчанию некоторого сигнала — игнорировать его. Означает ли это, что действие сигнала — 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()рекомендуется из соображений переносимости.

Связанный контент