在Linux中(特别是我有Ubuntu 14),如果某个程序因错误而终止,我可以通过$?
变量获得数值错误代码
$ ./failing_app
$ echo $?
然而,数字本身并不能告诉我太多,我如何获得错误名称和描述?$ man errno
中有一个错误列表,但它只给出了名称,没有给出数值。
我在谷歌上搜索了一下,结果很奇怪:例如,我有一个玩具 rust 程序,我试图访问数组元素超出界限。程序死机和$?
是101
,但它被认为是对应于Network unreachable
错误,这没有任何意义。
3条答案
按热度按时间yeotifhr1#
程序的退出状态(shell中的
$?
)与Cerrno
无关。在C程序中,退出状态通常来自
exit
的参数或main
的返回值,约定为0表示成功退出(或shell为true),其他值表示失败(或为false)。但是,如果程序因接收信号而死亡,shell会将
$?
设置为128加上信号编号,例如,在分段错误(SIGSEGV
,即11)时,$?
将为139。为了列出信号编号,我运行
kill -l
。gzszwxb42#
没有一个统一的定义权威。每个程序给错误代码分配自己的语义。好的程序在手册页有文档;例如参见GNU的
grep
和xargs
手册页。exit(3) Linux手册页还指出,“BSD已尝试标准化退出代码”。BSD
sysexits
(3) manual page实际上是很好的推荐阅读,但正如所指出的,对于有限数量的错误场景来说,几乎不是一个推动。内核有一组详细得多且文档化得很好的可能错误及其原因,但这显然仅限于系统调用,根本不解决应用程序级错误。
Advanced Bash Scripting Guide有一个关于通用约定的章节--但是就像ABS一般一样,它是标准、约定、作者个人观点、猜测和谎言的邪恶混合体(表中没有一个退出代码是“保留的”,尽管它是这么说的,并且引用该表的文本强调了这个不正确的事实)。
qfe3c7zg3#
此链接提供了一个错误的数字列表。希望这是你正在寻找的。http://www.thegeekstuff.com/2010/10/linux-error-codes/
此外,在我的系统上,我看到文件
/usr/include/asm-generic/errno-base.h
有错误的定义以及错误编号。这将是一个更好的参考比链接。