От APUE

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

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

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

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

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

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

  2. В книге упоминается, что действие по умолчанию некоторого сигнала состоит в том, чтобы игнорируй это. Означает ли это, что действие сигнала SIG_IGN или SIG_DFL или пустая функция? Например:

    Действие по умолчанию для SIGCHLD должно быть игнорировано. Мы описываем эти параметры в главе 10.

    SIGCONT: действие по умолчанию заключается в продолжении остановленного процесса, но игнорировании сигнала, если процесс не был остановлено.

Спасибо.

0
Tim 31 Май 2018 в 07:49

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() рекомендуется из соображений переносимости.

3
user000001 31 Май 2018 в 07:57
Спасибо. В «первом варианте специально игнорировать сигнал с помощью аргумента SIG_IGN системного вызова signal()» вы имеете в виду, что signal() — это системный вызов, в отличие от sigaction()?
 – 
Tim
31 Май 2018 в 07:21
Просто чтобы уточнить, sigaction() также является системным вызовом.
 – 
user000001
31 Май 2018 в 07:29
Я также вижу в книге упоминание о том, что действие по умолчанию для некоторого сигнала - игнорировать его. Означает ли это, что действие сигнала SIG_IGN или SIG_DFL или пустая функция?
 – 
Tim
31 Май 2018 в 07:43
Да для сигналов, которые по умолчанию игнорируются, тогда параметры идентичны
 – 
user000001
31 Май 2018 в 07:47
Я не уверен, что вы подразумеваете под "варианты идентичны". Вы имеете в виду, что «SIG_IGN» и «SIG_DFL» идентичны для некоторых сигналов, но не для других? Если да, то это сбивает с толку. Смотрите мое обновление к моему сообщению.
 – 
Tim
31 Май 2018 в 07:58