Java Process.exitValue() 中值的含义是什么?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11119970/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 03:53:18  来源:igfitidea点击:

What is the meaning of values from Java Process.exitValue()?

javaprocessexit-code

提问by michel.iamit

I am using Processvia ProcessBuilderto 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.

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

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).

我试图找到退出值的概述,但我找不到这个,现在我发现退出值可能取决于操作系统。(顺便说一下,我正在使用 Ubuntu)。

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.

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

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 = .....)

我发现 139 可能是 C 代码中的内存错误。我想摆脱可能。我无法获得退出值的任何概述(例如 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();

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.

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

采纳答案by npe

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)manpagefor signal values.

如果系统终止了您的应用程序(例如在Segmentation fault的情况下),它会将退出代码设置为 128 + SIGNAL -有关信号值,请参阅 linuxsignal(7)联机帮助页

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

另外,对于linux,sysexits.h头文件中定义了几个默认的退出码,建议程序员使用这些常量而不是手动定义自己的值。从exit(3)联机帮助页

BSD has attempted to standardize exit codes; see the file <sysexits.h>.

BSD 试图标准化退出代码;见文件<sysexits.h>

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 threadfor some additional information.

您还可以查看此线程以获取一些其他信息。