Я вижу в много унаследованного программного обеспечения и плохие учебники в Интернете , который рекомендуется использовать exit(-1)
, return -1
или сходного представлять «аварийное завершение». Проблема, по крайней мере, в POSIX, -1
никогда не была и не является допустимым кодом состояния. man 3 exit
иллюстрирует, что exit()
возвращает значение status & 0377
для родителя, что означает, что -1
становится 255
. В системах без POSIX EXIT_FAILURE
рекомендуется для переносимости. Но я никогда не вижу, что «-1 означает ненормальное завершение» в сочетании с «EXIT_FAILURE может быть чем-то отличным от 1», что указывает на то, что они явно полагают, что «-1» является обычным даже в системах, отличных от POSIX.
Вот пример вопроса StackOverflow, который увековечивает это. Программное обеспечение "unrealircd" также является примером программы, которая используется exit(-1)
для завершения программы. На практике это затрудняет взаимодействие systemd
.
Откуда взялся этот анти-паттерн? Это действительно в каком-то контексте?
источник
unsigned char
.char
поскольку его диапазон значений составляет от -128 до 127. Кроме того, я уже говорил, что «-1» преобразуется в «255» в моем теле вопроса ,Ответы:
Почти все компьютеры Unix используют двойное дополнение для целых чисел, а в двойном дополнении -1 всегда «все биты 1» независимо от размера слова. Если вы хотите получить максимально возможный код завершения независимо от размера статуса завершения программы, используйте -1 и позволяйте библиотеке усекать его удобным образом.
Это полезно, потому что когда сценарии или программы имеют более одного возможного состояния выхода (см.
grep
Простой пример), значимые из них обычно присваиваются наименьшим числам, что делает максимально возможный код выхода хорошим для использования при «неизвестной ошибке» или « прервать », так как это вряд ли когда-либо вступит в конфликт со значимым значением статуса.источник
exit()
какstatus &= 0xff
. Есть ли «размер слова», в котором-1 & 0xff
нет 255? Конечно, нет, потому что вся цель состоит в том, чтобы сделать его подходящим в диапазоне 0-255. В любом случае, ваше последнее предложение не имеет смысла: коды состояния 128-255 имеют специальное назначение в системах UNIX.