Unix历史记录:返回代码八进制?


10

我今天被gdb以下人员措手不及:

Program exited with code 0146.

gdb八进制打印返回代码; 调查为什么找到了我:http : //comments.gmane.org/gmane.comp.gdb.devel/30363

但这并不是一个特别令人满意的答案。一些快速谷歌搜索并没有揭示历史,所以我希望SO上的某个人可能知道背景故事。

一个有点相关的问题,如何看待八进制的返回码?也许旧机器总是打印返回码?

$ printf %o\\n $?

很尴尬:)


$?是shell对返回码值,是一个十进制数(或不支持GDB的例子也是在cmd?)。不知道为什么gdb以八进制报告它。我的解决方案是找出'ol man ascii以查看八进制值的含义。有趣的问题,因为您也会遇到其他程序的八进制值。也许在Kernighan和Pike的“ Unix编程环境”中进行了讨论。祝好运。
剥壳机2011年

退出状态可以大于一个数字,实际上是一个字节。同样,man ascii将八进制转换为十进制也没有用。bc会是一个更好的选择。
jlliagre

2
返回码是数字,而不是十进制或八进制。程序返回一个状态(一个字节)。使用wait(3)或它的部落,父进程可以找到很多有关进程为什么退出的信息(通常,即,自愿通过调用exit(2);被信号杀死...)
vonbrand

Answers:


6

八进制表示简化了最常用的小值的退出代码的解释。如果此数字(以字节为单位)以十进制打印,则发现哪个信号中断了进程将需要一点点计算,而八进制则可以按原样读取:

  • 进程退出并gdb显示状态5,05这没有什么区别
  • 进程退出,因为它显示了SIGINTControl+ C),比#更易于识别为信号2 。gdb0202130

此外,退出状态也可能是位掩码,在这种情况下,八进制(至少在几十年前比现在更常见的情况下,至少在习惯上)八进制比十进制甚至甚至更容易转换为比特十六进制,例如chmod仍然接受一个八进制数字来表示文件权限:0750 = 111 101 000 = rwx r-x ---


可能是在错误的地方提出这个问题,但是有没有一种简单的方法来判断GDB提供的数字是八进制还是十进制?
marinara

3
约定是如果它以零(0)开头,则为八进制。
jlliagre

3

我没有此文本的副本,只是阅读了Google图书中提供的简短说明。根据X / Open可移植性指南System V Specification Commands&Utilities第283页(根据Google图书)

如果应用程序异常终止,则其退出状态为八进制0200 + status,并且存在常见的“状态”值列表(可能也以八进制形式给出)。

因此,这是/曾经是一个可怜的人的错误消息。

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.