Как я могу получить то, что вернула моя основная функция? - PullRequest
64 голосов
/ 24 декабря 2011

В программе на C, если мы хотим дать какой-то ввод с терминала, тогда мы можем дать его следующим образом:

int main(int argc, char *argv[])

Точно так же, если мы хотим получить возвращаемое значение функции main(), то как мы можем ее получить?

В каждом main() мы пишем return 1 или return 0; как я могу узнать, что мой main() вернулся в терминал?

Изменить: 1

Я понял, что echo $? мы можем получить возвращаемое значение main(), но это позволяет мне только успешно вернуть значение меньше 125 (в Linux). Возвращаемое значение больше этого не может быть успешно получено $ variable, поэтому

почему int является типом возврата main()? Почему бы не оставить его short int?

Edit2

Откуда я могу узнать значение кода ошибки, если main() возвращает значение больше 125?

Ответы [ 5 ]

49 голосов
/ 24 декабря 2011

Большинство оболочек хранят код завершения предыдущей команды запуска в $?, поэтому вы можете сохранить или отобразить его.

$ ./a.out
$ echo $?     # note - after this command $? contains the exit code of echo!

или

$ ./a.out
$ exit_code=$?    # save the exit code in another shell variable.

Обратите внимание, что в Linux, хотя вы возвращаете int, обычно безопасны только значения меньше 126. Более высокие значения зарезервированы для записи других ошибок, которые могут возникнуть при попытке выполнить команду, или для записи того, какой сигнал, если он есть, завершил вашу программу.

40 голосов
/ 24 декабря 2011

Ваша оболочка, вероятно, имеет специальную переменную $?, в которой хранится последнее возвращенное программой значение.Итак, вскоре после завершения вашей программы вы можете запустить:

echo $?

, чтобы увидеть возвращаемое значение.

31 голосов
/ 24 декабря 2011

В DOS / Windows вы можете использовать errorlevel в пакетном файле

executable optional arguments
if errorlevel 4 goto LABEL4
if errorlevel 3 goto LABEL3
if errorlevel 2 goto LABEL2
if errorlevel 1 goto LABEL1
:SUCCESS
echo SUCCESS; errorlevel 0
goto :eof
:LABEL1
echo FAILURE; errorlevel 1
goto :eof
:LABEL2
echo FAILURE; errorlevel 2
goto :eof
REM ...

Просто не забудьте проверить, от самого большого до самого низкого, потому что if errorlevel 42 действительно означает "если уровень ошибки равен 42 или больше"

6 голосов
/ 30 декабря 2011

Обобщение комментариев, кусочков и кусочков, чтобы они были в одном месте.

Программа AC всегда имеет код выхода , который программа может решить для себя, завершится ли она нормально, путемвозврат значения из функции main или путем вызова функции exit.Если программа завершается ненормально, например, из-за ошибки сегментации, операционная система решает код выхода.

В Unix (Posix) код выхода представляет собой 8-битное значение: 0-255.Они объединяются с некоторыми другими метаданными в состояние : другие метаданные включают информацию о том, была ли программа завершена нормально или нет, была ли она завершена из-за сигнала, и если да, то какой сигнал.Подробнее см. Справочную страницу wait (2) .

В Unix, в оболочке, статус предыдущей команды доступен в виде специальной переменной $?.Поскольку код выхода составляет всего 8 бит, и он рассматривается как целое число без знака, если вы возвращаете отрицательное значение, оно превращается в положительное: -1 становится 255. Аналогично, если вы возвращаете значение, большее 255, только наименьшееиспользуются значимые 8 битов: 256 становится 0.

Тип возврата main равен int, а не short или char, потому что нет особого преимущества в том, чтобы сделать его меньшим типом,особенно на этом этапе истории, спустя десятилетия после того, как было принято решение.Теперь его изменение может вызвать только ненужные осложнения.

Если вы хотите запустить программу из C, стандартная библиотека предоставляет функцию system, которая легко возвращает статус программы.(Обратите внимание, что system запускает команды через оболочку, и вам нужно быть очень осторожным, чтобы избежать всего правильно, если вы дадите команде какие-либо внешние имена файлов или другие вещи в командной строке.)

Для большей гибкостиВы можете запускать другие программы, используя системные вызовы fork, execl (или один из его вариантов, см. справочную страницу exec (3) ) и wait (уже упоминалось выше).Это мощный и гибкий инструмент, но он также легко допускает ошибки, поэтому обязательно прочитайте документацию и ознакомьтесь с некоторыми примерами программ.(С другой стороны, очень интересно изучать этот материал.)

3 голосов
/ 24 февраля 2015

Вы можете получить значения выхода с помощью команды basic linux команда echo $?Коды ошибок являются стандартными, а подробности объяснены в этой ссылке

Общие коды

**

0- успех

1- общие ошибки

126- выдача разрешений

127-недопустимая команда

128-недопустимые аргументы и фатальные ошибки

255-Вне диапазона **

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...