system函数返回值探究
http://blog.chinaunix.net/uid-24774106-id-3048281.html?page=3
遇到system调用脚本,结果返回了256的情况,那么如何判断脚本是否正常成功调用,即取到脚本的真正返回值
system是个综合的操作,分解开来看就是相当于执行了
1 fork 生成一个子进程。
2 在子进程执行 execl("/bin/sh","sh","-c" command,(char*)0);
3 waitpid
下面进入正题,返回值:
1 如果fork失败了,或者waitpid返回除了EINTR之外的错误,system返回 -1;
2 execl执行失败,其返回值如同shell执行了"exit(127)" 一样。(非法命令)
3 如果上述三步都执行成功,那么,system返回值是shell的终止状态。
如果/bin/sh拉起shell命令失败,或者是shell命令没有正常执行 (比如命令根本就是非法的命令),那么,将原因填入status的8~15位。
这样就比较容易根据system的返回值进行问题定位了:
-1:创建子进程失败
对于其它值,先用返回值除以256,商对应的含义如下:
0:命令运行成功
1:通用未知错误
2:误用shell命令
126:命令不可执行
127:没有找到命令
128:无效退出参数
130:命令通过Ctrl+C终止
255:退出状态码越界
libin@libin:~/program/C/Linux/system$ ./tsys "nosuchcmd"
sh: nosuchcmd: not found
status = 32512
normal termination,exit status = 127
我们看到了,nosuchcmd不是shell支持的命令,所以,shell命令返回了127,对于system函数,返回值为 127*256 = 32512;因为shell的返回值是 system返回值的8~15位。
如果shell顺利执行完毕,那么将shell的返回值填到system返回值的8~15位。
这里需要强调以下,所谓顺利执行完毕,并不是说,命令command执行成功,而是指 /bin/sh顺利调用,执行期间没有被信号异常终止,这都算是顺利执行完毕。
libin@libin:~/program/C/Linux/system$ ./tsys "ls /noexisted"
ls: 无法访问/noexisted: 没有那个文件或目录
status = 512
normal termination,exit status = 2libin@libin:~/program/C/Linux/system$ ls /noexist
ls: 无法访问/noexist: 没有那个文件或目录
libin@libin:~/program/C/Linux/system$ echo $?
2
libin@libin:~/program/C/Linux/system$
我们看到了,虽然/noexist文件并不存在,ls这条命令执行出了错,但是仍然属于shell顺利执行完毕。 ls /noexist的错误吗是2,所以,system函数的返回值为 2*256 = 512.
所以,对于system函数,返回值是由两部分组成的,低8位值表示所执行的脚本在执行过程中所接收到的信号值,其余的位表示的脚本exit退出时所设置的值,
即脚本内exit退出是的值的低8位,在system返回值的低9-16位
各位可能比较感兴趣的是,如果我知道system的返回值,如何知道我的命令的返回值呢?手册中有这么一句话:
- Thus, the exit code of the command will be WEXITSTATUS(status)
看到了WEXITSTATUS(status),就是command的返回值。当然前提条件是shell命令顺利执行完毕。即:
- WIFEXITED(status) ! =0
#define _XOPEN_SOURCE#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>#include<signal.h>
#include<sys/wait.h>void pr_exit(int status)
{printf("status = %d\n",status);if(WIFEXITED(status)){printf("normal termination,exit status = %d\n",WEXITSTATUS(status));}else if(WIFSIGNALED(status)){printf("abnormal termination,signal number =%d%s\n",WTERMSIG(status),
#ifdef WCOREDUMPWCOREDUMP(status)?"core file generated" : "");
#else"");
#endif}
}int main(int argc,char* argv[])
{int status;if(argc<2){fprintf(stderr,"usage:tsys cmd\n");return -1;}if((status = system(argv[1]) )<0){fprintf(stderr,"system error\n");return -2;}pr_exit(status);return 0;
}
system函数返回值探究相关推荐
- system函数返回值
system(执行shell 命令) 相关函数 fork,execve,waitpid,popen 表头文件 #include<stdlib.h> 定义函数 int system(c ...
- system函数返回值,Linux
理论 我们先看下man手册是怎么说的man system RETURN VALUEThe value returned is -1 on error (e.g., fork(2) failed), a ...
- perl system函数返回值问题
在Perl脚本中,允许调用系统的命令来进行操作.这就是Perl灵活性的体现,作为一种系统命令的粘合语言,能给程序员带来许多的便利.这样,你就可以最大限度地利用别人的成果,用不着自己使劲造轮子了. 在P ...
- Linux system函数返回值
例: status=system("./test.sh"); 1.先统一两个说法: (1)system返回值:指调用system函数后的返回值,比如上例中status为system ...
- 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)
2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...
- java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?
1.我想实现的功能是在java程序中导入HttpURLConnection类,然后将函数的值作为post方法要提交的参数,最后显示在显示台上. 2.要用到的函数是自己写的可以显示实时计算机cpu.内存 ...
- 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )
文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...
- 【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )
文章目录 一.将 两头堵模型 抽象成业务模块函数 二.完整代码示例 一.将 两头堵模型 抽象成业务模块函数 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回值 : 函数的返回值 , 一般使用 ...
- java 11:数组作为函数参数,数组做为函数返回值
1 数组作为参数 我们可以将数组作为参数,传入到函数中,其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数: 又如, [java] ...
最新文章
- String类中的equals方法与Object类中的equals方法的不同点
- Python:cv2.imread读入图片后返回NoneType的解决方案
- java 判断crontab_crontab详解
- SpringBoot-@ComponentScan、@Import
- 前端学习(1041):todolist--html界面
- Codeforces914D Bash and a Tough Math Puzzle
- 学习MySQL,怎么能不会数据类型和schema优化!
- 《团队作业第三、第四周》五小福团队作业--Scrum 冲刺阶段--Day7
- LibEvent中文帮助文档--第1、2、3、4章
- 别爱太满,别睡太晚:寺庙的流量密码与新媒体生意经
- centos ntp日志_centos NTP服务器配置总结
- python主函数怎么写_类中的Python主函数
- 第一篇:初识信息系统监理工程师
- 案例分享 | 可编程机器人Scratch二次开发案例
- oCPC实践录 | 成本优化策略之eCPC(1)
- MBR生活污水处理设备常见参数的具体作用
- 数字系统设计(FPGA)课程设计: 多功能数字钟
- python之使用cmd命令行写程序
- vue 所见即所得_Vue html5编辑器:Vue的html5所见即所得编辑器
- etcc oracle ebs,Oracle EBS日志 log
热门文章
- [wikioi 1418]铃仙•优昙华院稻叶(东方幻想乡系列模拟赛)(树上递推)
- 好香呀,这是在虚拟环境中闻到的
- 基于MatLab的PCA降维人脸识别系统(超详细解说)
- 【使用指南】BXERP使用指南
- 更新 WinPython Spyder
- 计算机专业浪漫告白,不同专业的人怎样“表白”?化学系最浪漫,计算机系“活该”单身...
- python setup
- 刀锋铁骑服务器不稳定,看B站博主谈刀锋铁骑血泪发展史扎心啊
- 苹果描述的iPad难道是“四不象”?.
- 分析int(*p)[4] = a