В чем смысл значений из Java Process.exitValue()?

Я использую Process через ProcessBuilder для запуска исполняемого файла, созданного в коде C. Я ловлю Process.exitValue(), чтобы отреагировать на эти значения выхода. Я заметил, что не все значения выхода взяты из исполняемого файла. Например, я получаю выходное значение 139, и нигде в моем коде C я не возвращаю выходное значение 139.

Я пытаюсь найти обзор значений выхода, но не могу его найти, и теперь я узнал, что значение выхода может зависеть от ОС. (Кстати, я использую Ubuntu).

Кажется, единственное выходное значение, в котором нужно быть уверенным, это 0, когда все идет правильно. Существуют ли спецификации о выходных значениях? Могу ли я быть уверен, что определенный диапазон можно использовать только для моей собственной программы? Какие коды выхода зарезервированы для ОС.

Я узнал, что 139, вероятно, ошибка памяти в коде C. Я хочу избавиться от вероятного. Я не могу получить обзор значений выхода (например, 139 = .....)

Кстати, это упрощенный код:

ProcessBuilder p = new ProcessBuilder(executableName,
   executableArguments);
final Process shell = p.start();
InputStream shellIn = shell.getInputStream();
int shellExitStatus = shell.exitValue();

Примечание. Запуск исполняемого файла C в оболочке Ubuntu вообще не приводит к ошибке (т.е. выходное значение 0). Но выполнение той же команды в Java дает выходное значение 139.


person michel.iamit    schedule 20.06.2012    source источник
comment
139 — это ошибка сегментации. Это означает, что ваше c-app обращается к памяти, к которой оно не должно иметь доступ.   -  person npe    schedule 20.06.2012
comment
Это, я думаю, отвечает на ваш вопрос.   -  person Kazekage Gaara    schedule 20.06.2012
comment
это тоже нашел, но не знаю, насколько это важно для вас .   -  person Kazekage Gaara    schedule 20.06.2012
comment
@npe и Kazekage, спасибо, но это я примерно выяснил, что мне нужно знать, какой код выхода я могу использовать в c-коде, чтобы быть уверенным, что это мой собственный код выхода, и: где я могу найти список с выходом коды? В упомянутом ответе я видел поиск в stackoverflow, прежде чем публиковать этот вопрос.   -  person michel.iamit    schedule 20.06.2012
comment
второй комментарий kazekage полезен: он показывает диапазон...   -  person michel.iamit    schedule 20.06.2012
comment
@Kazekage, глядя на ссылку вашего второго комментария, означает ли это, что я не могу использовать какие-либо собственные определенные коды выхода?   -  person michel.iamit    schedule 20.06.2012
comment
@michel.iamit Эта ссылка говорит, что коды выхода выше 255 возвращаются по модулю 256. И я сомневаюсь, что это не зависит от ОС, учитывая, что список находится на tldp.org.   -  person Kazekage Gaara    schedule 20.06.2012


Ответы (1)


Если система завершает работу вашего приложения (например, в случае ошибки сегментации), она устанавливает код выхода 128 + SIGNAL — см. linux signal(7) справочная страница для значений сигналов.

Кроме того, для Linux существует несколько кодов выхода по умолчанию, определенных в заголовочном файле sysexits.h, и рекомендуется, чтобы программисты использовали эти константы вместо того, чтобы вручную определять собственные значения. Из exit(3) справочной страницы:

BSD попыталась стандартизировать коды выхода; см. файл <sysexits.h>.

Вы можете найти файл, например, здесь , и включены следующие значения:

#define EX_OK           0  /* successful termination */

#define EX__BASE        64  /* base value for error messages */

#define EX_USAGE        64  /* command line usage error */
#define EX_DATAERR      65  /* data format error */
#define EX_NOINPUT      66  /* cannot open input */
#define EX_NOUSER       67  /* addressee unknown */
#define EX_NOHOST       68  /* host name unknown */
#define EX_UNAVAILABLE  69  /* service unavailable */
#define EX_SOFTWARE     70  /* internal software error */
#define EX_OSERR        71  /* system error (e.g., can't fork) */
#define EX_OSFILE       72  /* critical OS file missing */
#define EX_CANTCREAT    73  /* can't create (user) output file */
#define EX_IOERR        74  /* input/output error */
#define EX_TEMPFAIL     75  /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76  /* remote error in protocol */
#define EX_NOPERM       77  /* permission denied */
#define EX_CONFIG       78  /* configuration error */

#define EX__MAX         78  /* maximum listed value */

Однако их использование не является обязательным, и вы можете использовать любое значение по своему усмотрению.

Общий ответ таков: если ваше приложение корректно завершает работу (то есть оно способно обработать ошибку и завершить выполнение), то оно само устанавливает код выхода. Если приложение уничтожается системой, именно система устанавливает код выхода.

Вы также можете просмотреть эту тему для получения дополнительной информации. .

person npe    schedule 20.06.2012