Почему я получаю ошибку 255 при возврате -1

10

Я новичок в программировании на C ++, и у меня есть очень простой вопрос. Я заметил, что когда я возвращаюсь -1в программу на C ++, а затем проверяю состояние выхода, я получаю 255. Это почему?

Код является самым основным:

int main()
    {
        return -1;
    }

Затем, после запуска скомпилированного кода:

echo $?
255
Евгений С
источник

Ответы:

24

Потому что в UNIX / POSIX код завершения программы определяется как 8-разрядное значение без знака. Преобразование -1 в 8-битный без знака дает 255.

Изменить, чтобы добавить:

Более подробно: семейство системных вызовов wait * () в UNIX кодирует результат процесса в одно 32-битное целое число. 32 бита этого результата дополнительно разбиваются для предоставления такой информации, как то, было ли сброшено ядро ​​процесса, выход из-за сигнала (и какой) и т. Д. Из этих 32 бит только 8 зарезервированы для кода выхода процесса и те интерпретируются как значение без знака.

Модель fork / exec / wait в UNIX / POSIX является одной из самых старых и наиболее глубоко встроенных функций; если бы вы разрабатывали новую операционную систему сегодня, вы могли бы сделать что-то другое (по крайней мере, использовать 64 бита :-)).

С другой стороны, практически полезно ли иметь> 255 кодов выхода? Я сомневаюсь в этом. Если бы вы действительно хотели что-то более мощное, я бы предложил переключиться на «строку выхода» вместо числового кода выхода с более широким диапазоном.

Злой ученый
источник
Хорошее редактирование. Спасибо за эту дополнительную информацию.
Джордж М
7

Цитировать со bashстраницы руководства на СТАТУС ВЫХОДА

Состояние выхода выполненной команды - это значение, возвращаемое системным вызовом waitpid или эквивалентной функцией. Статусы выхода находятся в диапазоне от 0 до 255, хотя, как объясняется ниже, оболочка может использовать значения выше 125 специально. Состояния выхода из встроенных команд оболочки и составных команд также ограничены этим диапазоном. При определенных обстоятельствах оболочка будет использовать специальные значения для указания конкретных режимов отказа.

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

Со waitpid (2)страницы руководства :

WEXITSTATUS(status)

возвращает статус выхода ребенка. Он состоит из наименее значащих 8 битов аргумента состояния, которые дочерний элемент указал в вызове exit (3) или _exit (2) или в качестве аргумента для оператора возврата в main (). Этот макрос должен использоваться только если WIFEXITED вернул true.

utopiabound
источник