У меня есть простая программа для проверки кодов выхода:Жутко коды изменения статуса
int main() {
return 2000;
}
В терминале, если я запускаю программу введите:
echo $?
терминал отвечает 208
. Какие? Зачем это делать?
У меня есть простая программа для проверки кодов выхода:Жутко коды изменения статуса
int main() {
return 2000;
}
В терминале, если я запускаю программу введите:
echo $?
терминал отвечает 208
. Какие? Зачем это делать?
В то время как возвращаемое значение main
является AN int
(как правило, 32 бит), только 8 бит код выхода передается в остальную часть операционной системы.
Mystical pointed out, 2000 % 256 = 208
.
В Linux, родительский процесс получает статус дочернего процесса через вызов wait
or waitpid
(обычно после ребенка exit
с). Этот вызов предоставляет значение статуса, закодированное в этом int
, является кодом выхода дочернего элемента, а также несколькими другими полями, указывающими, было ли/выведено дочернее устройство и т. Д. Код выхода извлекается с помощью макроса WEXITSTATUS
.
int status;
waitpid(childpid, &status, 0);
if (WIFEXITED(status))
printf("Child exited with code %d\n", WEXITSTATUS(status));
Интересно отметить, что я не вижу в этом упоминается ни в одном из man
страниц, хотя!
Но это очень очевидно, если мы посмотрим на ядро:
В kernel/exit.c
, мы видим, где exit
системный вызов определяется:
888 SYSCALL_DEFINE1(exit, int, error_code)
889 {
890 do_exit((error_code&0xff)<<8);
891 }
Вы можете увидеть прямо здесь, что int
код ошибки усекается до восьми бит и заполняется битами 15: 8 кода, переданного в do_exit
.
Похожие вопросы:
коды ошибок UNIX являются байт большой, так что ваше значение измельчают до его остаточного 256 мод, а именно 208.
Стандарт C определяет только три коды возврата: 0
, EXIT_SUCCESS
и EXIT_FAILURE
. (Как правило, EXIT_SUCCESS
является0
, но я не думаю, что это технически требуется.)
Если возвращение статус 0
или EXIT_SUCCESS
, затем «реализация определенных форм статус успешного завершения возвращается [к среда хоста] ». Если это EXIT_FAILURE
, то возвращается «неудачное завершение».
Любой другой код возврата определяется реализацией. Ваша реализация определяет, что возврат статуса 2000 возвращает 208 в среду хоста. Это полностью в его правах.
'2000% 256 = 208' – Mysticial
Коды выхода только до 256?Почему заставить main возвращать 'int' тогда? – sircodesalot
Потому что язык говорит так ... (язык требует 'main', чтобы вернуть' int') – Mysticial