我正在寻找java
可执行文件的可能退出代码的定义:
(如何)我可以判断退出代码是执行的Java进程还是VM本身?
示例:在Windows上,java -badoption
返回1
; java Main
Main
作为有效课程的1
也可以返回0
。
我可以使用任何VM选项使退出代码更有意义吗?例如。区分两种类型的退出代码?
如果我知道退出代码不是来自我的Java进程(只返回-1
),那么非零退出代码是什么意思?
在Windows上,我经常看到1
和{{1}}。由于这些是通过自动错误报告工具报告的,我看不到任何错误消息。我只有退出代码,需要解释它。
退出代码是否与平台有关?
答案 0 :(得分:5)
没有为Java / JVM专门定义的内容。这些退出代码的含义由ISO / IEC 9899(编程语言:C,例如7.20.4.3 ISO/IEC 9899:TC3的exit
功能),ISO / IEC 9945(IEEE 1003,POSIX)和类似的规格,它总是这样:
shell环境(sh
,bash
,cmd.exe
,make
等等)使用它来确定程序是否成功退出(0)或那里是一个错误(不是0)。
强烈建议仅使用0表示成功。使用0以外的值进行成功的程序会导致shell脚本,Makefile等的作者头痛。
由各个程序决定不同故障值的附加语义。但是,我认为-1
并不是一个好主意。最好的方法是使用EXIT_SUCCESS
和EXIT_FAILURE
,但<stdlib.h>
中的这些定义在Java中没有相应的对应项。 ISO / IEC 9899:2011没有描述应该如何定义EXIT_FAILURE
和EXIT_SUCCESS
。但是,它将0定义为与EXIT_SUCCESS
具有相同的语义,并且我不知道任何系统除了以下内容之外还执行其他任何操作,因此这是Java程序员可以假设的最好的事情:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
因此,我使用0表示成功,1表示失败,如果区分不同类型的故障很重要,则值与1不同。一个很好的例子是grep
命令。从其手册页(GNU grep):
退出状态 如果找到选定行,则退出状态为0,如果未找到,则退出状态为1。如果发生错误,则退出状态为2.(注意:POSIX错误处理代码应检查&#39; 2&#39;或更高。)
我不使用-1,因为它设置所有位,并且根据环境,-1实际上可能会意外地产生额外的虚假信息,例如声称信号被提升和相似。实际上,为了便携,退出代码应该在[0..127]
范围内,除非你真的真的知道你在做什么。
例如,在大多数POSIX系统上,退出代码将被截断为8位,退出代码高于127的语义是退出是由信号引起的。
BSD已尝试提供更多退出代码,这些退出代码可在/usr/include/sysexits.h
(man page)中找到。它们是这样的:
在没有任何其他有意义的标准的情况下,我认为我们能做的最好的事情就是使用它们。
在UNIX上,您可以通过从退出值中屏蔽低7位(减去128)来获取信号,在大多数shell中可以使用$?
查询。
SIGTERM
- &gt; VM:143
SIGTERM
SIGSEGV
- &gt; VM:134
SIGABRT
(因为VM处理SIGSEGV以编写hs_err文件,然后调用abort()
)。比较&#34;正常&#34;程序:
SIGSEGV
- &gt; prog:139
SIGSEGV
没有为JVM显式指定此行为,它只是POSIX环境中程序的正常预期行为。鉴于JVM希望自己处理SIGABRT
,编写比普通核心文件更具体的故障转储,即使SIGSEGV
而不是SIGSEGV
也是或多或少的预期。
TODO