Как я могу получить то, что вернула моя основная функция?
В программе на C, если мы хотим дать некоторый ввод от терминала, мы можем дать его:
int main(int argc, char *argv[])
Таким же образом, если мы хотим получить возвращаемое значение функции main()
, то как мы можем его получить?
В каждом main()
пишем return 1
или return 0
; как я могу узнать, что мой main()
вернулся в терминал?
Edit: 1
Я получаю, что echo $?
мы можем получить возвращаемое значение main()
, но оно позволяет мне только вернуть значение менее 125 (в Linux). Возвращаемое значение, которое больше не может быть получено с помощью $ variable
, поэтому
Почему int
возвращает тип main()
? Почему бы не сохранить его short int
?
Edit2
Откуда я могу узнать значение кода ошибки, если main()
возвращает значение больше 125?
Ответы
Ответ 1
Большинство оболочек хранят код выхода предыдущей команды запуска в $?
, чтобы вы могли сохранить или отобразить ее.
$ ./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, безопасны в использовании. Более высокие значения зарезервированы для записи других ошибок, которые могут возникнуть при попытке выполнить команду или для записи того, какой сигнал, если таковой имеется, завершил вашу программу.
Ответ 2
У вашей оболочки, вероятно, есть специальная переменная $?
, которая содержит последнее возвращаемое значение программы. Итак, вскоре после завершения вашей программы вы можете запустить:
echo $?
чтобы увидеть возвращаемое значение.
Ответ 3
В 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 или больше"
Ответ 4
Подводя комментарии и фрагменты, чтобы они находились в одном месте.
Программа C всегда имеет код выхода, который программа может решить для себя, если она нормально завершается, возвращая значение из функции 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
(уже упоминалось выше). Это мощный и гибкий, но также легко ошибиться, поэтому обязательно прочитайте документацию и сначала проверьте некоторые примеры программ. (С другой стороны, очень интересно изучить этот материал.)
Ответ 5
Вы можете получить значения выхода с помощью команды basic linux
echo $?
Коды ошибок являются стандартными, и детали объясняются в этом
ссылка
Общие коды
**
0 - успех
1- общие ошибки
126- разрешение
127-Недопустимая команда
128-Неверные аргументы и фатальные ошибки
255-Вне диапазона **