“ exit(-1)”来自哪里?


22

我看到在建议使用在互联网上有很多传统的软件和坏的教程exit(-1)return -1或类似的表示“异常终止”。问题是,至少在POSIX中,该问题-1从未存在过,并且不是有效的状态码。man 3 exit说明了exit()将的值返回status & 0377给父对象,即-1变为255。在非POSIX系统上,EXIT_FAILURE建议可移植。但是我从没看到“ -1表示异常终止”和“ EXIT_FAILURE可能不是1”,这表明他们清楚地相信“ -1”即使在非POSIX系统上也是常规的。

这是一个StackOverflow问题的例子,这个问题可以永久存在。软件“ unrealircd”也是exit(-1)用于终止程序的程序示例。实际上,这使与的交互变得困难systemd

这种反模式是从哪里来的?在某些情况下有效吗?


1
“类Unix系统有一个严格的约定,退出状态为0表示成功,任何非零退出状态都表示失败...这个约定很难连接到Unix shell中……”(非零退出状态清洁出口
蚊蚋

@gnat根据libc手册,退出状态明确为0到255(包括0和255)。如果某个地方的答案表明负值在某一点上是有效的,那我会接受,但是我发现这非常值得怀疑。
user222973 '16

1
@gnat“ 255”很容易放入unsigned char
user222973 '16


1
@gnat“ Java”中的字节不是无符号字符,char因为它的取值范围是-128到127 ,所以它更等效于a 。此外,我已经说过我的问题正文中将“ -1”转换为“ 255” 。
user222973 '16

Answers:


20

几乎所有的Unix计算机都对整数使用二进制补码,并且在二进制补码-1中,无论字长如何,始终为“所有位1”。如果不管程序退出状态的大小如何,都想要最大可能的退出代码,则使用-1并让库方便地截断它可以解决问题。

这很有用,因为当脚本或程序具有多个可能的退出状态时(请参阅grep简单的示例),有意义的脚本通常被分配给最小的数字,从而使尽可能大的退出代码成为“未知错误”或“中止”,因为它不太可能与有意义的状态值冲突。


以glibc为例,其实现exit()status &= 0xff。是否有一个-1 & 0xff不为255 的“字长” ?当然不是,因为整个目的是使它适合0-255的范围。无论如何,您的最后一句话没有任何意义:状态代码128-255在UNIX系统中确实具有特殊用途。
user222973 '16

2
不要混淆Bash退出值(0-127,128 +是特殊的Bash值)与程序退出值(0-255,请参阅pubs.opengroup.org/onlinepubs/009695399/functions/exit.html)。至于大小,请记住,C程序员自开始以来就一直在处理多种字长(最初为12位,16位和32位),因此我们会自动尝试一些不需要我们考虑字长的习惯用法。由于Unix比Posix早了20年,所以并不总是有8位的限制,所以我们写了,所以没关系。
Todd Knarr '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.