本文介绍了Java Process.exitValue()中值的含义是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通过 ProcessBuilder 使用 Process 来运行用C代码制作的可执行文件。我正在捕获 Process.exitValue()以对此退出值做出反应。我注意到并非所有退出值都来自可执行文件。例如,我得到139的退出值,在我的C代码中没有任何地方返回139的退出值。

I am using Process via ProcessBuilder to run an executable made in C code. I am catching the Process.exitValue() to react on this exit values. I noticed not all the exit values are from the executable. For example, I get an exit value of 139 and nowhere in my C code I am returning an exit value of 139.

我试图找到退出值的概述,但我找不到这个,现在我发现退出值可能与操作系统有关。 (我顺便使用Ubuntu)。

I am trying to find an overview of exit values, but I cannot find this, and now I found out the exit value can be OS dependent. (I am using Ubuntu by the way).

当一切正常时,似乎唯一的退出值是0。
是否有退出值的规格?我可以确定某个范围只能用于我自己的程序吗?为操作系统保留了哪些退出代码。

It seems the only exit value to be sure of is 0 when everything goes right.Are there specifications about exit values? Can I be sure that a certain range can be used only for my own program? What exit codes are reserved for the OS.

我发现139可能是C代码中的内存错误。我想摆脱可能。我无法获得退出值的任何概述(例如139 = .....)

I found out that 139 is probably a memory error in the C code. I want to get rid of the probably. I can't get any overview of exit values (e.g. 139 = .....)

顺便提一下,这是简化代码:

This is the simplified code by the way:

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

注意:在Ubuntu shell中运行C可执行文件完全没有错误(即退出值0) 。但是,在Java中执行相同的命令会给出退出值139。

Note: Running the C executable in the Ubuntu shell gives no error at all (i.e. exit value 0). But, doing the same command in Java gives exit value 139.

推荐答案

如果系统杀死了您的应用程序(例如分段错误)它将退出代码设置为128 + SIGNAL - 请参阅linux 。

If the system kills your application (like in the case of Segmentation fault) it sets the exit code to 128 + SIGNAL - see linux signal(7) manpage for signal values.

此外,对于linux,在 sysexits.h 头文件中定义了几个默认退出代码,建议程序员使用这些常量而不是手动定义自己的值。从:

Also, for linux, there are several default exit codes defined in sysexits.h header file, and it is recommended that programmers use those constants instead of manually defining own values. From exit(3) manpage:

你可以找到文件,例如,以及值包括:

You can find the file for example here, and the values included are:

#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 */

但是,使用它们不是强制性的,你可以自由使用你想要的任何值。

However, using them is not mandatory, and you are free to use any value you want.

一般的答案是 - 如果你的应用程序正常失败(即它能够处理错误完成执行),然后它自己设置退出代码。如果应用程序被系统杀死,则系统会设置退出代码。

The general answer is - if your application fails gracefully (i.e. it is able to handle the error an finish execution), then it sets the exit code by itself. If the application is killed by the system, it's the system who sets the exit code.

您还可以看到以获取更多信息。

You can also see this thread for some additional information.

这篇关于Java Process.exitValue()中值的含义是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 13:36
查看更多