Каким должен быть код выхода моей программы, если я поймал сигнал?

Я думаю, что, возможно, какое-то время делал это неправильно, потому что мы просто переключились на systemd, и он считает, что мой чисто убитый процесс завершился неудачно.

В основном я слушаю SIGHUP, SIGINT а также SIGTERM а затем (передав код сигнала обратно до main) чисто, например return 128+SIGHUP,

Я ожидал, что это будет использоваться для заполнения $?, но теперь я думаю, что понимаю, что оболочка отвечает за предоставление $? такое значение, а затем только если сигнал был необработанным. Таким образом, даже если процесс завершился в конечном итоге из-за сигнала, потому что сигнал был обработан, $? будет в конечном итоге 0 и все доказательства того, что сигнал имел какое-либо отношение к выходу, будут потеряны. Это правильно?

При обращении SIGHUP и чисто выходя, я должен return EXIT_SUCCESS от main?

6

Решение

Конвенция о возвращении 128 + <signal number> продвигается в руководстве Advanced Bash Scripting Guide среди других (https://stackoverflow.com/a/1535733/567292), но только для случая, когда ваша программа терпит неудачу в результате получения сигнала.

Если ваша программа получает сигнал, делает не обрабатывать его, и в результате завершается, статус выхода (как предусмотрено, например, wait) будет аналогичным, но вместо установленного бита 7 будет установлен более высокий бит для указания WIFSIGNALED в отличие от WIFEXITED, Если вы работаете в оболочке, это тогда переведенный оболочкой дать статус выхода ($?) в диапазоне 128-255 (т. е. с установленным битом 7), что касается сценария оболочки, программа возвращает 128+n неотличима от завершения программы, потому что сигнал был обработан:

[…] При сообщении о состоянии выхода с помощью специального параметра ‘?’ Оболочка должна сообщать о всех восьми битах доступного состояния выхода. Состояние выхода команды, которая завершилась из-за получения сигнала, должно быть сообщено как более 128.

Если ваша программа получает сигнал, то успешно выходы, это считается успешным завершением, поэтому ваша программа должна вернуться EXIT_SUCCESS,

5

Другие решения

Коды возврата обычно соответствуют указанным вами. Если вы хотите включить сигнал для кодов выхода, вы должны убедиться, что они по-прежнему остаются уникальными.

Если вам не нужен сигнал в коде выхода, кажется, нет смысла их включать.

Стоит ли возвращаться EXIT_SUCCESS или же EXIT_FAILURE зависит от вас / вашей программы, считается ли завершение успешным или неудачным.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector