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