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() 中的值是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章