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

我通过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。

如果系统杀死你的应用程序(就像分段错误一样 ),它会将退出代码设置为128 + SIGNAL – 有关信号值,请参阅linux signal(7)联机帮助页 。

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

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 (eg, 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 */ 

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

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

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