Как SIGINT относится к другим сигналам завершения?
в системах POSIX сигналы завершения обычно имеют следующий порядок (согласно многим справочным страницам и спецификациям POSIX):
SIGTERM-вежливо попросите процесс завершить. Он должен завершаться изящно, очищая все ресурсы (файлы, сокеты, дочерние процессы и т. д.), удаление временных файлов и так далее.
SIGQUIT-более сильный запрос. Он должен прекратить нелюбезный, все еще очищая ресурсы, которые абсолютно необходимы очистка, но, возможно, не удалять временные файлы, возможно, записывать отладочную информацию где-то; на какой-то системе также будет записан дамп ядра (независимо от того, пойман ли сигнал приложением или нет).
SIGKILL-самый сильный запрос. Процесс даже не просят ничего делать, но система очистит процесс, нравится это или нет. Скорее всего, написан дамп ядра.
Как SIGINT вписывается в эту картину? Процесс CLI обычно расторгнут по радиоразведке, когда пользователь нажимает на клавиатуре crtl+C, однако фоновый процесс также может быть расторгнут по радиоразведке использовании утилита Kill. То, что я не вижу в спецификациях или заголовочных файлах, - это если SIGINT более или менее силен, чем SIGTERM, или если есть какая-либо разница между SIGINT и SIGTERM вообще.
обновление:
лучшее описание сигналов завершения, которые я нашел до сих пор, находится в документация GNU LibC. Это объясняет очень хорошо, что есть предполагаемая разница между SIGTERM и SIGQUIT.
Это говорит о SIGTERM:
Это нормальный способ вежливо попросить программу прекратить.
и это говорит о SIGQUIT:
[...] и создает дамп ядра, когда он завершает процесс, так же, как сигнал ошибки программы.
Вы можете думать об этом как об ошибке программы, "обнаруженной" пользователем. [...]
Некоторые виды чисток являются лучше всего опустить в обращении SIGQUIT. Например, если программа
создает временные файлы, он должен обрабатывать другие запросы на завершение путем удаления временного
файлы. Но лучше для SIGQUIT не удалять их, чтобы пользователь мог изучить их в
вместе с дампа.
и SIGHUP также объясняется достаточно хорошо. SIGHUP на самом деле не является сигналом завершения, это просто означает, что "соединение" с пользователем было потеряно, поэтому приложение не может ожидать пользователя чтобы прочитать любой дальнейший вывод (например, вывод stdout/stderr), и больше нет ввода, который можно ожидать от пользователя. Для большинства приложений, которые означают, что они лучше бросить курить. Теоретически приложение также может решить, что оно переходит в режим демона при получении SIGHUP и теперь работает как фоновый процесс, записывая вывод в настроенный файл журнала. Для большинства демонов, уже работающих в фоновом режиме, SIGHUP обычно означает, что они должны пересмотреть свои файлы конфигурации, поэтому вы отправляете его в фоновые процессы после редактирование конфигурационных файлов.
однако на этой странице нет полезного объяснения SIGINT, кроме того, что он отправляется CRTL+C. Есть ли причина, по которой можно обрабатывать SIGINT по-другому, чем SIGTERM? Если да, то по какой причине это будет и как будет отличаться обработка?
6 ответов:
SIGTERM и SIGKILL предназначены для запросов общего назначения "завершить этот процесс". SIGTERM (по умолчанию) и SIGKILL (всегда) вызовут завершение процесса. SIGTERM может быть пойман процессом (например, чтобы он мог сделать свою собственную очистку, если захочет) или даже полностью проигнорирован; но SIGKILL не может быть пойман или проигнорирован.
SIGINT и SIGQUIT предназначены специально для запросов от терминала: для их генерации могут быть назначены определенные входные символы сигналы (в зависимости от настройки терминала). Действие по умолчанию для SIGINT-это тот же тип завершения процесса, что и действие по умолчанию для SIGTERM и неизменяемое действие для SIGKILL; действие по умолчанию для SIGQUIT также является завершением процесса, но могут возникать дополнительные действия, определяемые реализацией, такие как создание дампа ядра. При необходимости процесс может быть пойман или проигнорирован.
SIGHUP, как вы говорите, предназначен для указания того, что терминал соединение было потеряно, а не быть сигналом завершения как таковым. Но, опять же, действие по умолчанию для SIGHUP (если процесс не улавливает или игнорирует его) заключается в том, чтобы завершить процесс таким же образом, как SIGTERM и т. д. .
есть таблица в POSIX определения
signal.hв котором перечислены различные сигналы и их действия и цели по умолчанию, а также Общий Терминальный Интерфейс глава включает в себя гораздо более подробную информацию о сигналы, связанные с терминалом.
Как отметил DarkDust, многие сигналы имеют одинаковые результаты, но процессы могут присоединять к ним различные действия, различая, как генерируется каждый сигнал. Глядя на исходный код ядра FreeBSD (kern_sig.c) я вижу, что два сигнала обрабатываются одинаково, они завершают процесс и доставляются в любой поток.
SA_KILL|SA_PROC, /* SIGINT */ SA_KILL|SA_PROC, /* SIGTERM */
после быстрого поиска Google для sigint vs sigterm, похоже, что единственное предполагаемое различие между ними заключается в том, было ли оно инициировано сочетанием клавиш или явным вызовом
kill.в результате вы можете, например, перехватить sigint и сделать с ним что-то особенное, зная, что он, вероятно, был отправлен с помощью сочетания клавиш. Возможно, обновить экран или что-то еще, вместо того, чтобы умирать (не рекомендуется, как люди ожидают
^Cубить программа, просто пример).Я также узнал, что
^\должен отправить sigquit, который я могу начать использовать сам. Выглядит очень полезно.
некоторые из них ANSI C, а другие нет
значительная разница в том, что:
- SIGINT и SIGTERM являются ANSI C, поэтому более портативны
- SIGQUIT и SIGKILL не являются
они описаны в разделе "7.14 обработка сигналов"C99 проект N1256:
- SIGINT получение интерактивного сигнала внимания
- прекращается с заявление о расторжении договора направляется программа
Что делает SIGINT хорошим кандидатом для интерактивного Ctrl + C.
С помощью
kill(как системный вызов, так и утилита` вы можете отправить практически любой сигнал на любой процесс, если у вас есть разрешение. Процесс не может различить, как возник сигнал и кто его послал.это, как говорится, SIGINT действительно предназначен для singal прерывания Ctrl-C, в то время как SIGTERM является общим терминальным сигналом. Нет понятия сигнала, который был бы" более сильным", за единственным исключением, что есть сигналы, которые не могут быть заблокированы или обработаны (SIGKILL и SIGSTOP, согласно справочной странице).
сигнал может быть только "более сильным", чем другой сигнал относительно того, как процесс приема обрабатывает сигнал (и какое действие по умолчанию для этого сигнала). Например, по умолчанию и SIGTERM, и SIGINT приводят к завершению. Но если вы игнорируете SIGTERM, то он не завершит ваш процесс, в то время как SIGINT все еще делает.
за исключением нескольких сигналов, обработчики сигналов могут уловить сигналы, или поведение по умолчанию при получении сигнала может быть изменен. Смотрите
signal(7)страница для деталей.
Comments