如果是,在哪个操作系统上,shell或其他?
考虑下面的java程序(我使用java只是作为一个例子,任何语言都适合这个问题,这是关于操作系统的):
public class ExitCode {
public static void main(String args[]) {
System.exit(Integer.parseInt(args[0]));
}
}
在Linux和bash上运行它,它总是返回小于255的值,例如。(echo $?
打印上一个执行命令的退出代码)
> java ExitCode 2; echo $?
2
> java ExitCode 128; echo $?
128
> java ExitCode 255; echo $?
255
> java ExitCode 256; echo $?
0
> java ExitCode 65536; echo $?
0
编辑:下面的(唯一的,到目前为止)答案充分解释了UNIX上发生的事情。我还在想其他的操作系统。
3条答案
按热度按时间kqhtkvqz1#
使用
wait()
或waitpid()
这在Unix和使用POSIX函数的衍生工具(如
wait()
和waitpid()
)上是不可能的。返回的退出状态信息由两个8位字段组成,一个包含退出状态,另一个包含有关死亡原因的信息(0表示在程序控制下有序退出,其他值表示信号杀死了它,并表示核心是否被转储)。使用
sigaction()
和SA_SIGINFO
如果您努力工作,并阅读
sigaction()
和<signal.h>
的POSIX规范以及Signal Actions,您会发现您可以获得由子进程传递给exit()
的32位值。然而,它并不是完全直截了当的。运行时(程序
sigexit73
从sigexit73.c
编译而来),会产生如下输出:删除了对
nanosleep()
的1毫秒调用后,输出很可能如下所示:注意,这里只有三行开始于
Signal
,也只有三行结束于waited
;一些信号和退出状态丢失。这可能是因为SIGCHLD
信号被设置到父进程之间的时序问题。但关键是,当代码使用
sigaction()
、SIGCHLD
、SA_SIGINFO
跟踪状态时,exit()
状态下可以传输4字节的数据。为了记录在案,测试是在运行macOS莫哈韦10.14.6的MacBook Pro上进行的,使用GCC 9.2.0和XCode 11.3.1。代码也可以在我的SOQ(堆栈溢出问题)存储库中找到,作为src/so-1843-7779子目录中的
sigexit73.c
文件。yiytaume2#
在现代Windows上,操作系统本身和默认控制台shell(
CMD.EXE
)至少在整个32位有符号整数范围内接受和显示退出代码。在CMD.EXE
中运行上面的示例,会得到您要求的退出代码:Windows并没有Unix信号的概念,也不会试图劫持退出代码来添加额外的信息,所以只要你的shell(或者任何最终阅读退出代码的程序)也不这样做,你就应该取回你返回的退出代码。幸运的是,使用Microsoft的C运行时的程序(包括所有用MS Visual C++编译的程序)将退出代码保留为退出进程的原样。
huwehgph3#
Windows有更多的退出代码,超过14,000个。(我相信你经常在自己的屏幕上看到其中的一些)。
来了: