Java Process.exitValue() 中的值是啥意思?

Posted

技术标签:

【中文标题】Java Process.exitValue() 中的值是啥意思?【英文标题】:What is the meaning of values from Java Process.exitValue()?Java Process.exitValue() 中的值是什么意思? 【发布时间】:2012-06-20 12:50:10 【问题描述】:

我通过ProcessBuilder 使用Process 来运行用C 代码制作的可执行文件。我正在捕捉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();

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

【问题讨论】:

139 是一个分段错误。这意味着您的 c-app 正在访问它不应该访问的内存。 This 我相信会回答你的问题。 也找到了this,但我不知道它对你来说有多重要。 @npe 和 Kazekage,thanx,但我大概发现了,我需要知道的是,我可以在 c 代码中使用什么退出代码,以确保它是我自己的退出代码,并且:在哪里可以找到带有退出代码的列表?提到的答案,我确实在发布此问题之前在 *** 上进行了搜索。 风影的第二条评论很有用:它显示了范围...... 【参考方案1】:

如果系统终止了您的应用程序(例如 分段错误),它会将退出代码设置为 128 + SIGNAL - 请参阅 linux signal(7) manpage 了解信号值。

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

BSD 已尝试标准化退出代码;查看文件<sysexits.h>

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

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

但是,使用它们不是强制性的,您可以随意使用任何您想要的值。

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

您还可以查看this thread 了解更多信息。

【讨论】:

以上是关于Java Process.exitValue() 中的值是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Java Switch

Java Math

Java 布尔运算

java [Java] Java常用代码#java

Java - 35 Java 实例

Java While 循环