2013-10-01 4 views
4

У меня есть простая программа для проверки кодов выхода:Жутко коды изменения статуса

int main() { 
    return 2000; 
} 

В терминале, если я запускаю программу введите:

echo $? 

терминал отвечает 208. Какие? Зачем это делать?

+4

'2000% 256 = 208' – Mysticial

+0

Коды выхода только до 256?Почему заставить main возвращать 'int' тогда? – sircodesalot

+0

Потому что язык говорит так ... (язык требует 'main', чтобы вернуть' int') – Mysticial

ответ

6

В то время как возвращаемое значение 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.

Похожие вопросы:

2

коды ошибок UNIX являются байт большой, так что ваше значение измельчают до его остаточного 256 мод, а именно 208.

2

Стандарт C определяет только три коды возврата: 0, EXIT_SUCCESS и EXIT_FAILURE. (Как правило, EXIT_SUCCESSявляется0, но я не думаю, что это технически требуется.)

Если возвращение статус 0 или EXIT_SUCCESS, затем «реализация определенных форм статус успешного завершения возвращается [к среда хоста] ». Если это EXIT_FAILURE, то возвращается «неудачное завершение».

Любой другой код возврата определяется реализацией. Ваша реализация определяет, что возврат статуса 2000 возвращает 208 в среду хоста. Это полностью в его правах.

Смежные вопросы