Как SIGINT соотносится с другими сигналы завершения, такие как SIGTERM, SIGQUIT и SIGKILL?

В системах POSIX, сигналы завершения обычно имеют следующий порядок (согласно многим страницам MAN и спецификациям POSIX):

  1. SIGTERM - вежливо попросить процесс завершить работу. Он должен завершиться корректно, очищая все ресурсы (файлы, сокеты, дочерние процессы и т. Д.), Удаляя временные файлы и т. Д.

  2. SIGQUIT - более сильный запрос. Он должен прекратить некорректную очистку ресурсов, которые абсолютно нуждаются в очистке, но, возможно, не удалит временные файлы, возможно, где-нибудь запишет отладочную информацию; в некоторых системах также будет записан дамп ядра (независимо от того, перехватывает сигнал приложение или нет).

  3. SIGKILL - самый сильный запрос. Процесс даже не просит что-либо делать, но система очистит процесс, нравится ему это или нет. Скорее всего написан дамп ядра.

Как SIGINT вписывается в эту картину? Процесс CLI обычно завершается SIGINT, когда пользователь нажимает CRTL + C, однако фоновый процесс также может быть завершен SIGINT с помощью утилиты KILL. Что я не вижу в спецификациях или файлах заголовков, так это то, является ли SIGINT более или менее убедительным, чем SIGTERM, или есть ли вообще какая-либо разница между SIGINT и SIGTERM.

UPDATE:

Лучшее описание сигналов завершения, которые я нашел пока находится в документации GNU LibC . Это очень хорошо объясняет предполагаемое различие между SIGTERM и SIGQUIT.

О SIGTERM сказано:

Это нормальный способ вежливо попросить программу о завершении.

А про SIGQUIT сказано:

однако фоновый процесс также может быть остановлен SIGINT с помощью утилиты KILL. Что я не вижу в спецификациях или файлах заголовков, так это то, является ли SIGINT более или менее убедительным, чем SIGTERM, или есть ли вообще какая-либо разница между SIGINT и SIGTERM.

UPDATE:

Лучшее описание сигналов завершения, которые я нашел пока находится в документации GNU LibC . Это очень хорошо объясняет предполагаемое различие между SIGTERM и SIGQUIT.

О SIGTERM сказано:

Это нормальный способ вежливо попросить программу о завершении.

А про SIGQUIT сказано:

однако фоновый процесс также может быть остановлен SIGINT с помощью утилиты KILL. Что я не вижу в спецификациях или файлах заголовков, так это то, является ли SIGINT более или менее убедительным, чем SIGTERM, или есть ли вообще какая-либо разница между SIGINT и SIGTERM.

UPDATE:

Лучшее описание сигналов завершения, которые я нашел пока находится в документации GNU LibC . Это очень хорошо объясняет предполагаемое различие между SIGTERM и SIGQUIT.

О SIGTERM сказано:

Это нормальный способ вежливо попросить программу о завершении.

А про SIGQUIT сказано:

Лучшее описание сигналов завершения, которое я нашел до сих пор, находится в документации GNU LibC . Это очень хорошо объясняет предполагаемое различие между SIGTERM и SIGQUIT.

О SIGTERM сказано:

Это нормальный способ вежливо попросить программу о завершении.

А про SIGQUIT сказано:

Лучшее описание сигналов завершения, которое я нашел до сих пор, находится в документации GNU LibC . Это очень хорошо объясняет предполагаемое различие между SIGTERM и SIGQUIT.

О SIGTERM сказано:

Это нормальный способ вежливо попросить программу о завершении.

А про SIGQUIT сказано:

[...] и создает дамп ядра при завершении процесса, как сигнал об ошибке программы. Вы можете думать об этом как о состоянии ошибки программы, «обнаруженной» пользователем. [...] Некоторые виды очистки лучше не выполнять при обработке SIGQUIT. Например, если программа создает временные файлы, он должен обрабатывать другие запросы на завершение, удаляя временные файлы. Но SIGQUIT лучше не удалять их, чтобы пользователь мог изучить их в в сочетании с дампом ядра.

И SIGHUP также достаточно хорошо объяснен. SIGHUP на самом деле не является сигналом завершения, это просто означает, что «соединение» с пользователем было потеряно, поэтому приложение не может ожидать, что пользователь прочитает какой-либо дальнейший вывод (например, вывод stdout / stderr), и нет ввода, ожидаемого от пользователь больше. Для большинства приложений это означает, что им лучше выйти. Теоретически приложение может также решить, что оно переходит в режим демона при получении SIGHUP и теперь работает как фоновый процесс, записывая выходные данные в настроенный файл журнала. Для большинства демонов, уже работающих в фоновом режиме, SIGHUP обычно означает, что они должны повторно проверить свои файлы конфигурации, поэтому вы отправляете его фоновым процессам после редактирования файлов конфигурации.

Однако на этой странице нет полезного объяснения SIGINT, кроме этого он отправляется CRTL + C. Есть ли причина, по которой можно обрабатывать SIGINT иначе, чем SIGTERM? Если да, то по какой причине это было бы и как изменилась бы обработка?

95
задан Ciro Santilli 新疆改造中心法轮功六四事件 24 July 2019 в 13:10
поделиться