Подтвердить что ты не робот

Почему я не могу вернуть большие значения из основной функции?

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

Если я возвращаю меньшее значение, например, 100, оно отображает правильное значение.

Мой код:

int main(void)
{
     return 1000;
}

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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