В системах POSIX сигналы завершения обычно имеют следующий порядок (согласно многим страницам MAN и спецификации POSIX):
SIGTERM - вежливо попросить завершить процесс. Он должен завершиться корректно, очистив все ресурсы (файлы, сокеты, дочерние процессы и т. Д.), Удалив временные файлы и так далее.
SIGQUIT - более сильная просьба. Он должен прекратить некорректную очистку ресурсов, которые абсолютно нуждаются в очистке, но, возможно, не удалит временные файлы, возможно, где-нибудь запишет отладочную информацию; в некоторых системах также будет записан дамп ядра (независимо от того, пойман ли сигнал приложением или нет).
СИГКИЛЛ - сильнейшая просьба. Процесс даже не просит что-либо делать, но система очистит процесс, нравится ему это или нет. Скорее всего написан дамп ядра.
Как SIGINT вписывается в эту картину? Процесс CLI обычно завершается SIGINT, когда пользователь нажимает CRTL + C, однако фоновый процесс также может быть завершен SIGINT с помощью утилиты KILL. Что я не вижу в спецификациях или файлах заголовков, так это то, является ли SIGINT более или менее убедительным, чем SIGTERM, или есть ли вообще какая-либо разница между SIGINT и SIGTERM.
ОБНОВИТЬ:
Лучшее описание сигналов завершения, которое я нашел до сих пор, находится в документации GNU LibC . Это очень хорошо объясняет предполагаемое различие между SIGTERM и SIGQUIT.
О SIGTERM сказано:
Это нормальный способ вежливо попросить программу завершить работу.
А про SIGQUIT сказано:
[...] и производит дамп ядра при завершении процесса, как сигнал об ошибке программы. Вы можете думать об этом как о состоянии ошибки программы, «обнаруженной» пользователем. [...] Определенные виды очистки лучше не выполнять при обработке SIGQUIT. Например, если программа создает временные файлы, она должна обрабатывать другие запросы на завершение, удаляя временные файлы. Но SIGQUIT лучше не удалять их, чтобы пользователь мог изучить их вместе с дампом ядра.
И SIGHUP тоже достаточно хорошо объяснен. SIGHUP на самом деле не является сигналом завершения, это просто означает, что «соединение» с пользователем было потеряно, поэтому приложение не может ожидать, что пользователь прочитает какой-либо дальнейший вывод (например, вывод stdout / stderr), и нет ввода, ожидаемого от пользователь больше. Для большинства приложений это означает, что им лучше выйти. Теоретически приложение может также решить, что оно переходит в режим демона при получении SIGHUP и теперь работает как фоновый процесс, записывая выходные данные в настроенный файл журнала. Для большинства демонов, уже работающих в фоновом режиме, SIGHUP обычно означает, что они должны повторно проверить свои файлы конфигурации, поэтому вы отправляете его фоновым процессам после редактирования файлов конфигурации.
Однако на этой странице нет полезного объяснения SIGINT, кроме того, что он отправляется CRTL + C. Есть ли причина, по которой можно обрабатывать SIGINT иначе, чем SIGTERM? Если да, то по какой причине это было бы и чем было бы иначе?