gpt4 book ai didi

java - Java Process.exitValue() 中的值是什么意思?

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:35 24 4
gpt4 key购买 nike

我正在通过 ProcessBuilder 使用 Process 来运行用 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。

最佳答案

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

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

BSD has attempted to standardize exit codes; see the file <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 - Java Process.exitValue() 中的值是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11119970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com