5

我正在使用ProcessviaProcessBuilder运行用 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。

4

1 回答 1

4

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

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

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

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

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

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

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

您还可以查看此线程以获取更多信息。

于 2012-06-20T13:23:08.130 回答