Вопрос по java, process, exit-code – Что означает значение из Java Process.exitValue ()?

5

я использую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.

Найденныйthis тоже, но я не знаю, насколько это важно для вас. Kazekage Gaara
This я отвечаю на твой вопрос Kazekage Gaara
139 являетсяSegmentation fault, Это означает, что вашc-app обращается к памяти, к которой он не должен получить доступ. npe
второй комментарий kazekage полезен: он показывает диапазон ... michel.iamit
@npe и Kazekage, спасибо, но вот что я примерно узнал, мне нужно знать, какой код выхода я могу использовать в c-коде, чтобы убедиться, что это мой собственный код выхода, и: где я могу найти список с кодами выхода? Ответ, на который я ссылался, я видел поиск по stackoverflow до публикации этого вопроса. michel.iamit

Ваш Ответ

1   ответ
4

Если система убивает ваше приложение (как в случае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 */

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

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

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

Похожие вопросы