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

Java Process.exitValue()中的值的含义是什么?,java,process,exit-code,Java,Process,Exit Code,我正在通过ProcessBuilder使用Process运行一个用C代码生成的可执行文件。我正在捕获进程。exitValue()以对此退出值做出反应。我注意到并非所有的退出值都来自可执行文件。例如,我得到一个退出值139,而在我的C代码中,我没有返回一个退出值139 我试图找到退出值的概述,但我找不到,现在我发现退出值可能依赖于操作系统。(顺便说一下,我正在使用Ubuntu) 当一切正常时,似乎唯一可以确定的退出值是0。 是否有关于退出值的规范?我能确定某个范围只能用于我自己的程序吗?为操作系统

我正在通过
ProcessBuilder
使用
Process
运行一个用C代码生成的可执行文件。我正在捕获
进程。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();

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

如果系统终止您的应用程序(如在分段故障的情况下),它会将退出代码设置为128+信号-有关信号值,请参阅linux

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

BSD试图将出口代码标准化;请参阅文件

例如,您可以找到该文件,其中包含的值包括:

#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 */
但是,使用它们不是强制性的,您可以自由地使用任何您想要的值

一般的答案是-如果您的应用程序正常地失败(即,它能够处理错误并完成执行),那么它将自行设置退出代码。如果应用程序被系统终止,则由系统设置退出代码


您还可以查看更多信息。

139是分段错误。这意味着你的c-app正在访问它不应该访问的内存。回答了你的问题,我相信。也找到了,但我不知道它对你有多重要。@npe和Kazekage,thanx,但我大致找到了,我需要知道的是,我可以在c代码中使用什么exitcode,确保它是我自己的exitcode,以及:我在哪里可以找到带有exitcode的列表?提到的答案是,在发布这个问题之前,我确实看到了在stackoverflow上搜索。kazekage的第二条评论很有用:它显示了范围。。。