`
mmdev
  • 浏览: 12925593 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Linux 获取其他程序返回值

 
阅读更多


例:

status=system("./test.sh");

1、先统一两个说法:
(1)system返回值:指调用system函数后的返回值,比如上例中status为system返回值
(2)shell返回值:指system所调用的shell命令的返回值,比如上例中,test.sh中返回的值为shell返回值。

2、如何正确判断test.sh是否正确执行?
仅判断status是否==0?或者仅判断status是否!=-1?

都错!

3、man中对于system的说明

RETURN VALUE
The value returned is -1 on error (e.g. fork() failed), and the return
status of the command otherwise. This latter return status is in the
format specified in wait(2). Thus, the exit code of the command will
be WEXITSTATUS(status). In case /bin/sh could not be executed, the
exit status will be that of a command that does exit(127)
.
看得很晕吧?

system函数对返回值的处理,涉及3个阶段:
阶段1:创建子进程等准备工作。如果失败,返回-1。
阶段2:调用/bin/sh拉起shell脚本,如果拉起失败或者shell未正常执行结束(参见备注1),原因值被写入到status的低8~15比特位中。system的man中只说明了会写了127这个值,但实测发现还会写126等值。
阶段3:如果shell脚本正常执行结束,将shell返回值填到status的低8~15比特位中。
备注1:
只要能够调用到/bin/sh,并且执行shell过程中没有被其他信号异常中断,都算正常结束。
比如:不管shell脚本中返回什么原因值,是0还是非0,都算正常执行结束。即使shell脚本不存在或没有执行权限,也都算正常执行结束。
如果shell脚本执行过程中被强制kill掉等情况则算异常结束。

如何判断阶段2中,shell脚本是否正常执行结束呢?系统提供了宏:WIFEXITED(status)。如果WIFEXITED(status)为真,则说明正常结束。
如何取得阶段3中的shell返回值?你可以直接通过右移8bit来实现,但安全的做法是使用系统提供的宏:WEXITSTATUS(status)。


由于我们一般在shell脚本中会通过返回值判断本脚本是否正常执行,如果成功返回0,失败返回正数。
所以综上,判断一个system函数调用shell脚本是否正常结束的方法应该是如下3个条件同时成立:
(1)-1 != status
(2)WIFEXITED(status)为真
(3)0 ==WEXITSTATUS(status)

注意:
根据以上分析,当shell脚本不存在、没有执行权限等场景下时,以上前2个条件仍会成立,此时WEXITSTATUS(status)为127,126等数值。
所以,我们在shell脚本中不能将127,126等数值定义为返回值,否则无法区分中是shell的返回值,还是调用shell脚本异常的原因值。shell脚本中的返回值最好多1开始递增。

判断shell脚本正常执行结束的健全代码如下:


WIFEXITED(stat_val) Evaluates to a non-zero value if status
was returned for a child process that
terminated normally.

WEXITSTATUS(stat_val) If the value of WIFEXITED(stat_val) is
non-zero, this macro evaluates to the
low-order 8 bits of the status argument
that the child process passed to _exit()
or exit(), or the value the child
process returned from main().

分享到:
评论

相关推荐

    shell脚本中执行python脚本并接收其返回值的例子

    1.在shell脚本执行python脚本时,需要通过python脚本的返回值来判断后面程序要执行的命令 例:有两个py程序 hello.py 代码如下: def main():  print “Hello” if __name__==’__main__’:  main() world.py def ...

    ioctl_driver:有关如何编写Linux驱动程序的示例

    IOCTL驱动程序 关于如何为Linux创建IOCTL驱动程序的简单示例。...ioctl_app.c显示了访问驱动程序并获取返回值的示例 Makefile来构建应用程序 load_driver.sh 加载驱动程序ioctl 。 这可能需要sudo权限!

    Linux 打印堆栈方法

    获取当前的调用栈信息,结果存储在buffer中,返回值为栈的深度,参数size限制栈的最大深度,即最大取size步的栈信息。 char **backtrace_symbols(void *const *buffer, int size); 把backtrace获取的栈信息转化为...

    linux进程监控和进程守护程序

    获取程序列表2启动进程3.监控进程,若程序岀或崩溃,重新启动程序4.收到退 出信号,安全结束监控程序 成功返回1,失败返回0 零牢容容家容字家容容察*禁容容字哮零常字容容容家察容牢容零容容容容容牢字家客字容牢容零容*...

    Java调用Shell脚本代码

    在Java程序中调用Unix/Linux主机上的Shell命令,并返回相应执行结果。

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的建立。 9.我们可以看见工程中的所有...

    linux系统编程之线程.zip

    start_routine返回时,这个线程就退出了,其它线程可以调用pthread_join得到start_routine的返回值,类似于父进程调用wait(2)得到子进程的退出状态,稍后详细介绍pthread_join。 pthread_create成功返回后,新创建的...

    浅谈Linux系统中的异常堆栈跟踪的简单实现

    本文将简单介绍Linux中C/C++程序运行时堆栈获取,首先来看backtrace系列函数——使用范围适合于没有安装GDB或者想要快速理清楚函数调用顺序的情况 ,头文件execinfo.h int backtrace (void **buffer, int size); 该...

    redhat linux教材20课程学习文档

    第一部分 Linux简介和原理介绍 第一章 概述 ...三、 Linux 的技术资源(获取途径、以网上链接为主、Linux社区分类介绍) 四、 GNU通用公共许可证(GPL) 五、 Linux发行版 六、 index(关键词索引)

    linux内核 0.11版本源码 带中文注释

    #include <linux/sched.h> // 调度程序头文件,定义了任务结构task_struct、第1 个初始任务 // 的数据。还有一些以宏的形式定义的有关描述符参数设置和获取的 // 嵌入式汇编函数程序。 #include <linux/head.h> /...

    易语言程序免安装版下载

    修改应用接口支持库,增强“取快捷方式目标”命令功能,可以获取目标、参数、启始位置、图标、运行方式、快捷键、备注等信息。 9. 修改扩展界面支持库三,解决高级选择夹会导致所在窗口的收不到“首次激活”事件的...

    阿里云DDNS动态域名服务

    程序运行后驻留系统托盘,可设定倒计时参数,定时查询WAN口和域名绑定IP...可添加多条公网IP查询网址,当自动运行时逐个查询,获取有返回值的IP。 实现Ngrok网络穿透,微信开发、APP开发、无公网IP实现外网访问利器。

    Posix线程编程指南.rar

    线程同步 4.1互斥锁 4.1.1 创建和销毁 4.1.2互斥锁属性 4.1.3锁操作 4.1.4其他 4.2条件变量 4.2.1创建和注销 4.2.2等待...4.3.3获取灯值 4.3.4其他 4.4异步信号 4.5其他同步方式 5....

    Python实现大数据收集至excel的思路详解

    一、在工程目录中新建一个excel... (2)、程序默认是每天会定时调取接口并获取接口的返回值并写入excel中(我使用的定时任务是:linux下的contab)  (3)、针对接口异常未正确返回数据时,使用特殊符号如:NA代替并写入

    Shell脚本学习笔记

    6.2 返回值 111 6.2.1 默认退出状态 111 6.2.2 使用return命令 111 6.2.3 使用函数输出 112 6.3 在函数中使用变量 112 6.3.1 向函数传递参数 112 6.3.2 在函数中处理变量 113 6.4 数组变量与函数 114 6.4.1 向函数...

    PHP3程序设计

    2.9 测试Linux环境下的ODBC 18 2.10 总结 18 第3章 PHP中的数据处理 19 3.1 数值 19 3.1.1 数字 19 3.1.2 文本 20 3.2 变量 23 3.2.1 标量 23 3.2.2 数组变量 24 3.2.3 多维数组 27 3.2.4 变量替换 28 3.2.5 动态...

    获取USB摄像头的1080p的JPEG格式的图片20180608_1806.7z

    // V4L2摄像头获取单幅图片测试程序(MMAP模式) // [日期:2011-03-06] 来源:Linux社区 作者:aokikyon [字体:大 中 小] // // #加了点注释 // // #Rockie Cheng // printf #include #include // memset ...

    gosnmp:用GoLang编写的SNMP库

    高斯 GoSNMP是完全用Go编写的SNMP客户端库。 它提供Get,GetNext,GetBulk,Walk,BulkWalk,Set和Traps。... GoSNMP具有以下帮助程序功能: ToBigInt-将返回值视为*big.Int 分区-有助于分割大块OID gosnmp / gosnmp与

    Foxpro 开发答疑160问

    69. 如何进行DOS/Windows文本文件与UNIX/Linux文本文件的相互转换 257 70. 如何遍历磁盘中的所有目录及文件 258 71. 如何使用低级函数读写文件 263 72. 如何为Visual FoxPro应用程序增加文件压缩功能 271 73. ...

Global site tag (gtag.js) - Google Analytics