2016-09-01 3 views
6

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

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

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

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

+0

Я думаю, это зависит. Если завершение сигналом считается успешным запуском двоичного файла, тогда да. Если эти сигналы указывают на ошибку, EXIT_FAILURE. – Hayt

+0

@ Hayt: Итак, вытаскивание - это то, что я не должен делать _anything_, чтобы включить код сигнала в код выхода процесса в любом случае? –

+0

Прекращается или вешается знак того, что ваша программа не справилась со своей задачей? – StoryTeller

ответ

5

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

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

[...] При составлении отчетов о состоянии выхода со специальным параметром, оболочка должна сообщать полные восемь бит статуса выхода доступны «?». Статус завершения команды, завершившей, потому что он получил сигнал будет сообщаться больше, чем 128.

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

+1

Отлично, спасибо :) Это было «ошибкой» в моей рамке событий в течение примерно шести лет. Упс ... –

2

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

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

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