27 февр. 2018 г., 19:49 от Nathanmichel.iamit

Что означает значение из Java Process.exitValue ()?

я используюProcess с помощьюProcessBuilder запустить исполняемый файл, выполненный на С-коде. Я ловлю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.

Ответы на вопрос (0)

23 мая 2017 г., 14:30 от Communitynpe

Если система убивает ваше приложение (как в случаеSegmentation fault) он устанавливает код выхода 128 + СИГНАЛ - см. Linuxsignal(7) manpage для значений сигнала.

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

BSD has attempted to standardize exit codes; see the file <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 */

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

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

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

ВАШ ОТВЕТ НА ВОПРОС