我正在通过Process
使用ProcessBuilder
运行以C代码制成的可执行文件。我正在捕获Process.exitValue()
对这个退出值使用react。我注意到并不是所有的退出值都来自可执行文件。例如,我得到的退出值为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)
manpage。
另外,对于linux,在sysexits.h
头文件中定义了几个默认的退出代码,建议程序员使用这些常量,而不是手动定义自己的值。从 exit(3)
manpage:
您可以找到文件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了解更多信息。