Диапазон возвращаемых значений основной функции - PullRequest
20 голосов
/ 01 марта 2011

Что стандарт говорит о диапазоне основных возвращаемых значений?Скажи только до 255?

Потому что

int main(void){
return 256;
}
echo $? ;  # out 0

Ответы [ 7 ]

18 голосов
/ 01 марта 2011

Стандарт не говорит. 0, EXIT_SUCCESS и EXIT_FAILURE имеют (вроде) определенные значения. Все остальное зависит от реализации.

В настоящее время большинство Unix-систем поддерживают только 8-битные возвращаемые значения. Windows поддерживает (как минимум) 32-битное возвращаемое значение. Я не проверял, поддерживает ли 64-битная Windows 64-битное возвращаемое значение, но я скорее сомневаюсь в этом, поскольку даже 64-битная Windows обычно по-прежнему использует 32-битный тип int.

14 голосов
/ 01 марта 2011

Как уже говорили другие, стандарты C & C ++ вообще не ограничивают возвращаемые значения, кроме того, что утверждают, что (1) main возвращает int (который имеет размер, определенный реализацией) и (2)ноль (или EXIT_SUCCESS) - успешный возврат, а EXIT_FAILURE - неуспешный возврат.Он указывает, что main, который явно не возвращает значение, обрабатывается так, как если бы он возвратил ноль.

В этом случае интерпретация возвращаемого значения зависит от процесса, который ожидает в процессе.завершить (позвонив wait , waitpid или waitid ). wait и waitpid являются более старыми функциями POSIX, и они указывают, что только младшие значащие восемь битов возвращаемого значения должны быть доступны ожидающему родительскому процессу .Стандарт POSIX: 2008 добавил waitid в качестве обобщенного метода ожидания, который имеет доступ к полному состоянию завершения дочернего процесса.

После разделения подпроцесса другой процесс вызывает один из ждать функции, чтобы перевести в спящий режим, пока не завершится разветвленный процесс (например, возврат из main, вызовы exit или abort или что-то еще)Функции wait и waitpid возвращают status посредством указателя на целое число.Вызывающая сторона извлекает фактическое состояние выхода, используя макросы WIFEXITED(status_val) и WEXITSTATUS(status_val).Последний определяется POSIX и должен возвращать младших 8 битов аргумента состояния .Функция waitid использует указатель на структуру siginfo_t для возврата информации о состоянии процесса.Элемент si_status содержит полное значение состояния, как описано в Информация о состоянии .

В основном, значения статуса выхода находятся в глазе наблюдателя .Спецификации ANSI / ISO являются открытыми.Пакет POSIX имеет несколько способов ожидания завершения процесса и получения его статуса завершения.POSIX также определяет spawn как облегченную версию exec, которая имеет свой собственный набор ограничений на значения состояния выхода.Оболочки имеют привычку дополнительно ограничивать значения результатов - GNU bash ограничивает возвращаемый статус до 7 битов, а POSIX-совместимая оболочка ограничивает выходные значения состояния до 8 битов.Кстати, большинство людей согласны с тем, что ограничение ваших возвращаемых значений на ниже 64 кажется безопасным .

4 голосов
/ 01 марта 2011

Коды выхода - это числа от 0 до 255 включительно в Unix-подобных системах. Вы можете вернуть что угодно, но в Linux это мод 256. Взгляните здесь , чтобы получить хорошее объяснение кодов возврата Linux. Существует также статья в Википедии на тему , в которой кратко говорится о кодах выхода для Windows.

3 голосов
/ 01 марта 2011

Стандарт C не накладывает особых ограничений на коды выхода, параграф о возвращаемом значении main делегирует документацию о функции exit(), которая в свою очередь гласит:

Если значение статуса равно нулю или EXIT_SUCCESS, возвращается заданная реализацией форма успешного завершения статуса.Если значение состояния EXIT_FAILURE, возвращается форма, определяемая реализацией завершения безуспешного состояния.В противном случае возвращаемый статус определяется реализацией.

, что, помимо рекомендаций EXIT_SUCCESS / EXIT_FAILURE, в основном означает «делай, что хочешь».:)

Как сказано в одном комментарии, тот факт, что в системах POSIX фактически рассматриваются только младшие 8 битов кода выхода, является просто UNIXism, происходящим из того, как wait syscall разработан (статус выхода должен быть упакован в младшие 8 битов возвращаемого значения wait) и не имеет ничего общего со стандартом C.

Контрпример - Windows, где весьучитывается значение, переданное exit / return (если оно не больше DWORD 1 , но я не думаю, что они когда-либо сделают int большеDWORD, было бы много кода).

1. Поскольку параметр GetExitCodeProcess, зарезервированный для возврата этого значения, равен DWORD *.

2 голосов
/ 01 марта 2011

В Unix системный вызов wait устанавливает значение состояния типа int, упакованное как битовое поле, с различными типами дочерней информации завершения.Если дочерний процесс завершается выходом (как определено макросом WIFEXITED; обычно альтернативой является то, что он умер от неперехваченного сигнала), SUS указывает, что младшие 8 битов значения состояния содержат состояние выхода;это можно получить с помощью макроса WEXITSTATUS в wait.h.Таким образом, в состояниях выхода Unix ограничиваются значениями 0-255 , диапазон 8-разрядного целого без знака.

В Unix-подобных системах обычно используется соглашение об отсутствии и успехеноль за ошибку.Некоторые соглашения были разработаны относительно относительного значения различных кодов ошибок;например, GNU рекомендует, чтобы коды с набором старших бит были зарезервированы для серьезных ошибок, а FreeBSD задокументировала обширный набор предпочтительных интерпретаций.

Стандарт C99 определяет только 0 и 1. Однако допускает другие значения

Подробнее см. Статус выхода вики.

0 голосов
/ 01 марта 2011

5.1.2.2.3 Завершение программы 1 Если тип возврата основной функции является типом, совместимым с int, возврат из начального вызова основной функции эквивалентен вызову функции выхода с возвращенным значениемосновной функцией в качестве аргумента;10) при достижении}, который завершает основную функцию, возвращается значение 0. Если возвращаемый тип не совместим с int, состояние завершения, возвращаемое в хост-среду, не указано

http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / n1124.pdf

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

0 голосов
/ 01 марта 2011

Вы возвращаете тип int. Вы должны иметь возможность вернуть любое значение, которое может быть сохранено в int. Точный размер int зависит от реализации, поэтому я не могу дать вам точный диапазон.

...