2016-01-20 2 views
5

Например ...Почему коды возврата свыше 255 возвращают число differn в C++?

#include <iostream> 

using namespace std; 

int main(){return 300;} 

Возвращает:

Process finished with exit code 44 

??

+3

Это всего лишь 8 бит. '300 & 0xff == 44'. Довольно уверен, что это в основном вещь Unix. См. 'WEXITSTATUS' в manpage' waitpid' - статус OR'd в некоторые другие значения. – asveikau

+0

Не могли бы вы объяснить, почему? и можно ли вернуть большее число? – leszakk

+2

Существует не такая вещь, как код возврата за 255. ОС игнорирует любые биты за первые восемь. – EJP

ответ

8

Стандарт знает только два standaradized возвращаемые значения: EXIT_SUCCESS (или ноль) и EXIT_- FAILURE:

3.6.1/5 Оператор возврата в главное имеет эффект оставляя основную функцию (уничтожая любой объекты с автоматическим временем хранения) и , вызывающие std::exit с возвращаемым значением в качестве аргумента.

18.5/8 (...) Наконец, управление возвращается в среду хоста. Если статус равен нулю или EXIT_SUCCESS, возвращается форма реализации статуса . Если статус равен EXIT_- FAILURE, Форма, определяющая реализацию, имеет безуспешное завершение статуса: . В противном случае возвращаемый статус определяется положением.

Следовательно, не гарантируется, что любое другое целое число возвращается как есть.

На MS Windows, например, функция GetExitCodeProcess() возвращает целое значение, так что вы получите 300.

На POSIX совместимых систем, как Linux, правило таково, что («только 8 младших битов (т.е. статус & 0377) должны быть доступны для ожидающего родительского процесса «). Так что для 300, это будет 44.

+0

Фактически, под UNIX код выхода находится в MSB, поэтому '(status & 0xff00) >> 8'. Причина только 8 бит - историческая: в оригинале unix [разработан для PDP-11], 'int' был 16 бит, поэтому не было места для большего кода ошибки в' status' для 'wait'. Для обратной совместимости размер кода ошибки был не увеличен, хотя большинство арок теперь определяют 'int' как 32-битный объект. Как уже упоминалось, поскольку код, возвращаемый программой, проходит через ОС и получен родителем из syscall, зависит от типа ОС. –

+0

@CraigEstey Интересно, спасибо! Действительно, я нашел в «* Дизайн операционной системы unix» примечание, поясняющее, что младшие 8 бит, переданные в 'exit()', хранятся в битах с 8 по 15 кода возврата внутреннего процесса, как вы сказали.Я полагаю, что именно по этой причине код возврата, полученный из ['wait()') (http://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html), должен быть правильно интерпретирован с помощью WIFEXITED () ',' WEXITSTATUS() 'и т. Д. ... И то же самое для возврата [' system() '] (http://man7.org/linux/man-pages/man3/system.3.html). – Christophe

+0

Благодаря @HansPassant для обновления. Фактически документация Windows «exit()« говорит »* младший байт статуса становится доступной для среды хоста *». Но тест показывает, что полное целое число всегда возвращается, точно так же, как вы заявили в отношении 'GetExitCodeProcess()'. Это происходит даже при использовании устаревшего 'execlp()'. Таким образом, кажется, что отсутствие слова «только» должно интерпретироваться как «младший байт или больше» :-) – Christophe