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的返回值,如何知道我的命令的返回值呢?手册中有这么一句话:

  1. Thus, the exit code of the command will be WEXITSTATUS(status)

看到了WEXITSTATUS(status),就是command的返回值。当然前提条件是shell命令顺利执行完毕。即:

  1. 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函数返回值探究相关推荐

  1. system函数返回值

    system(执行shell 命令) 相关函数  fork,execve,waitpid,popen 表头文件  #include<stdlib.h> 定义函数  int system(c ...

  2. system函数返回值,Linux

    理论 我们先看下man手册是怎么说的man system RETURN VALUEThe value returned is -1 on error (e.g., fork(2) failed), a ...

  3. perl system函数返回值问题

    在Perl脚本中,允许调用系统的命令来进行操作.这就是Perl灵活性的体现,作为一种系统命令的粘合语言,能给程序员带来许多的便利.这样,你就可以最大限度地利用别人的成果,用不着自己使劲造轮子了. 在P ...

  4. Linux system函数返回值

    例: status=system("./test.sh"); 1.先统一两个说法: (1)system返回值:指调用system函数后的返回值,比如上例中status为system ...

  5. 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)

    2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...

  6. java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?

    1.我想实现的功能是在java程序中导入HttpURLConnection类,然后将函数的值作为post方法要提交的参数,最后显示在显示台上. 2.要用到的函数是自己写的可以显示实时计算机cpu.内存 ...

  7. 【C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 形参返回值 | 函数返回值 | 函数形参处理 | 形参指针判空 )

    文章目录 一.字符串翻转模型 业务函数 二.完整代码示例 一.字符串翻转模型 业务函数 将上一篇博客 [C 语言]字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数 ; 字符 ...

  8. 【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )

    文章目录 一.将 两头堵模型 抽象成业务模块函数 二.完整代码示例 一.将 两头堵模型 抽象成业务模块函数 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回值 : 函数的返回值 , 一般使用 ...

  9. java 11:数组作为函数参数,数组做为函数返回值

    1 数组作为参数 我们可以将数组作为参数,传入到函数中,其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数: 又如, [java] ...

最新文章

  1. String类中的equals方法与Object类中的equals方法的不同点
  2. Python:cv2.imread读入图片后返回NoneType的解决方案
  3. java 判断crontab_crontab详解
  4. SpringBoot-@ComponentScan、@Import
  5. 前端学习(1041):todolist--html界面
  6. Codeforces914D Bash and a Tough Math Puzzle
  7. 学习MySQL,怎么能不会数据类型和schema优化!
  8. 《团队作业第三、第四周》五小福团队作业--Scrum 冲刺阶段--Day7
  9. LibEvent中文帮助文档--第1、2、3、4章
  10. 别爱太满,别睡太晚:寺庙的流量密码与新媒体生意经
  11. centos ntp日志_centos NTP服务器配置总结
  12. python主函数怎么写_类中的Python主函数
  13. 第一篇:初识信息系统监理工程师
  14. 案例分享 | 可编程机器人Scratch二次开发案例
  15. oCPC实践录 | 成本优化策略之eCPC(1)
  16. MBR生活污水处理设备常见参数的具体作用
  17. 数字系统设计(FPGA)课程设计: 多功能数字钟
  18. python之使用cmd命令行写程序
  19. vue 所见即所得_Vue html5编辑器:Vue的html5所见即所得编辑器
  20. etcc oracle ebs,Oracle EBS日志 log

热门文章

  1. [wikioi 1418]铃仙•优昙华院稻叶(东方幻想乡系列模拟赛)(树上递推)
  2. 好香呀,这是在虚拟环境中闻到的
  3. 基于MatLab的PCA降维人脸识别系统(超详细解说)
  4. 【使用指南】BXERP使用指南
  5. 更新 WinPython Spyder
  6. 计算机专业浪漫告白,不同专业的人怎样“表白”?化学系最浪漫,计算机系“活该”单身...
  7. python setup
  8. 刀锋铁骑服务器不稳定,看B站博主谈刀锋铁骑血泪发展史扎心啊
  9. 苹果描述的iPad难道是“四不象”?.
  10. 分析int(*p)[4] = a