返回值引起的一次问题
问题起始于一次命令调用出错,获取返回值为零的情况。在此做个记录。一个严谨的程序最少应该有两个返回值,零和非零,分别用来表示正常和异常的执行。
- 问题背景:在linux中执行python脚本,脚本中使用cmd调用hive -e来执行hive sql,脚本使用命令的exit code退出。可是有几次异常退出后,python脚本执行的返回值为零,导致其他模块认为执行成功,不做处理。
- 问题定位:在log中找到exit code,发现不为零。觉得应该是linux的返回值问题。发现exit code大于255而且刚好为256的整数倍。
- 问题分析:linux的返回码为一个Byte(8位),即0~255,大于255则取模。
关于linux和c语言的exit code
exit code
都调用了系统调用的_exit,_exit函数中status参数定义了进程的终止状态,父进程可以通过wait()来获取该状态值。需要注意的是返回值,虽然status是int型,但是仅有低8位可以被父进程所用。所以写exit(-1)结束进程时,在终端执行“$?”会发现返回值是255。
退出状态码的约定
如果是shell相关的编程,退出值最好不要大于128,POSIX标准规定了退出状态和含义如下:
- 0,命令执行成功
- 1~125之间是由各个命令自己定义的。
- 126,命令找到,文件无法执行
- 128以上的返回值,是由内核来管理的,比如用中断信号终止一个程序运行,该程序的返回值就是130