2010-09-17 5 views
20

Я пытаюсь вернуть большее значение как 1000 из моей основной функции, но когда я типа echo $? отображается 0.Почему я не могу вернуть большие значения из основной функции?

Если я вернусь меньшее значение, как 100 он показывает правильное значение.

Мой код:

int main(void) 
{ 
    return 1000; 
} 

Есть ли какие-либо ограничения на значения, которые мы можем вернуться?

+0

Я получаю ** 232 ** для 'return 1000;' и ** 233 ** для 'return 1001;' – Lazer

+5

** 1000% 256 = 232 ** – Lazer

ответ

22

Здесь есть две связанные концепции: C статус выхода и код возврата bash. Они оба охватывают диапазон 0-255, но bash использует цифры выше 126 для своих целей, поэтому было бы странно возвращать их из вашей программы.

Чтобы быть безопасным, коды статуса выхода на выход до 0-127, как это наиболее переносимо, по крайней мере, это подразумевается http://docs.python.org/library/sys.html#sys.exit.

Статус выхода C вставляется в bash $? переменная после выполнения, но bash использует 127, чтобы указать «команда не найдена», поэтому вы можете этого избежать. Bash reference page.

Bash также использует сигналы 128-255 для сигналов - они показывают, что процесс был убит с помощью сигнала: exit code = 128 + signal number. Таким образом, вы можете уйти с использованием чисел, близких к 255, так как маловероятно, что номера сигналов будут такими высокими.

Помимо этих общих направляющих есть много попыток определить, что должны означать разные цифры: http://tldp.org/LDP/abs/html/exitcodes.html.

Итак, вы хотите вернуть произвольное целое из вашей программы, вероятно, лучше всего напечатать его на stdout и захватить его с помощью VALUE=$(program) из вашего сценария bash.

+0

Я считаю, что диапазон 0-255 (т. Е. диапазон 'uint8_t') на системах * NIX - не знакомы ни с какими системами с максимальным значением 127 (что подразумевало бы, что тип подписанного возврата эквивалентен' int8_t', но это также подразумевает нижнюю границу -128.) –

+0

+1 Спасибо за объяснение:) – Searock

+0

Помимо сообщения о некорректном диапазоне (как отметил Джонатан), вы также, похоже, путаете статус выхода программы (как сообщает 'waitpid (2)') и статус выхода команды оболочки (as сообщенный '$?'). «128-255 используются для сигналов» применимы только к последним. –

3

Возвращаемое значение main (то есть статус выхода приложения) ограничено диапазоном [0, 255] на * NIX. 1000 выходит за пределы допустимого диапазона, и ОС рассматривает это как 0, предположительно.

+2

Нет, по крайней мере, в bash, статус выхода больше 255 возвращает значение по модулю 256. 1000 вернет 232 –

+0

Это то, что я бы предположил, исходя из того, как C обрабатывает числа, но OP сказал, что он получает 0 в качестве результата. –

1

В Unix-land возвращаемое значение main ограничено, так как exit ограничен диапазоном 8-разрядного байта.

В Windows есть одно значение, STILL_ACTIVE со значением 259, которое лучше всего избегать как код выхода процесса.

Кроме этого, в Windows вы можете вернуть 32-разрядный код, например HRESULT, и это обычно делается.