ExitCodes больше 255, возможно?

Если да, на какой операционной системе, оболочке или что-то еще?

Рассмотрим следующую java-программу (я использую java только как пример, любой язык был бы хорош для этого вопроса, что больше касается операционных систем):

public class ExitCode {
    public static void main(String args[]) {
        System.exit(Integer.parseInt(args[0]));
    }
}

Запустив его в Linux и bash, он всегда возвращает значения, равные 255, например. (echo $? выводит код выхода предыдущей выполненной команды)

> java ExitCode 2; echo $?
2

> java ExitCode 128; echo $?
128

> java ExitCode 255; echo $?
255

> java ExitCode 256; echo $?
0

> java ExitCode 65536; echo $?
0

EDITED: ответ (только, пока) полностью объясняет, что происходит в UNIX. Мне все еще интересно о других ОС.

Ответы

Ответ 1

Невозможно для Unix и производных. Возвращенная информация о статусе выхода состоит из двух 8-битовых полей, одна из которых содержит статус выхода, а другая содержит информацию о причине смерти (0 подразумевает упорядоченный выход из режима управления программой, другие значения, указывающие на то, что сигнал был убит, и указывает, ядро было сброшено).

Ответ 2

В современных Windows, сама ОС и консоль консоли по умолчанию (CMD.EXE), принимают и показывают коды выхода по крайней мере по всему диапазону 32-разрядных целых чисел. Выполнение вашего примера выше в CMD.EXE дает коды выхода, которые вы просили:

> java ExitCode 2
> echo %errorlevel%
2

> java ExitCode 128
> echo %errorlevel%
128

> java ExitCode 255
> echo %errorlevel%
255

> java ExitCode 256
> echo %errorlevel%
256

> java ExitCode 65536
> echo %errorlevel%
65536

В Windows действительно нет концепции сигналов Unix, и она не пытается захватить код выхода для добавления дополнительной информации, так что если ваша оболочка (или любая другая программа заканчивает чтение кода выхода) не делает что либо вы должны вернуть обратно коды возврата, которые вы вернули. К счастью, программы, использующие среду выполнения Microsoft C (включая все программы, скомпилированные с MS Visual С++), сохраняют код выхода, как это происходит из процессов.