system(执行shell 命令)

  相关函数  fork,execve,waitpid,popen

  表头文件  #include<stdlib.h>

  定义函数  int system(const char * string);

  函数说明  system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

  返回值  如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

  附加说明  在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。

  范例  #include<stdlib.h>

  main()

  {

  system(“ls -al /etc/passwd /etc/shadow”);

  }

  执行  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd

  -r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow

Upon successful completion, the system subroutine returns the exit status of the shell. The exit status of the shell
       is returned in the same manner as a call to the wait or waitpid subroutine, using the structures in the sys/wait.h
       file.

If the String parameter is a null pointer and a command processor is available, the system subroutine returns a
       nonzero value. If the fork subroutine fails or if the exit status of the shell cannot be obtained, the system
       subroutine returns a value of -1. If the exec l subroutine fails, the system subroutine returns a value of 127. In
       all cases, the errno global variable is set to indicate the error.

----------------------------------------------------------------------------------------------------------------------------------------------------

linux中system函数的返回值

刚用到system函数,要根据其返回值来做进一步操作,可是system的返回值并不等于其调用的程序的返回值,man了没看懂,后来在网上搜索了一下,终于看到了一个DX的理解,记录之。

引自:原文

要分成两部分来说:
1,在程序中,用exit来设置进程的退出值时,虽然该函数的参数类型为int型,但再父进程中只能取到其值的低8位.所以用exit返回值时,高于255的值是没有意义的.

2,对于system函数,返回值是由两部分组成的,低8位值表示所执行的脚本在执行过程中所接收到的信号值,其余的位表示的脚本exit退出时所设置的值,

即脚本内exit退出是的值的低8位,在system返回值的低9-16位

这样我们就可以通过右移操作来得到exit的值了。

----------------------------------------------------------------------------------------------------------------------------------------------------

以下转自:http://zhangwenxin82.blog.163.com/blog/static/1145959562010323103241387/

1,在程序中,用exit来设置进程的退出值时,虽然该函数的参数类型为int型,但再父进程中只能取到其值的低8位.所以用exit返回值时,高于255的值是没有意义的.

2,对于system函数,返回值是由两部分组成的,低8位值表示所执行的脚本在执行过程中所接收到的信号值,其余的位表示的脚本exit退出时所设置的值,

即脚本内exit退出是的值的低8位,在system返回值的低9-16位.

Linux中调用 system的返回值     

包含文件
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
先写一个被调用的函数
==================================
#include <iostream>
int main()
{
printf("Return 10./n");
return 10;
}
==================================
编译后生成一个"rt"的可执行文件
运行结果
==================================
Return 10.
==================================
再写一个调用system的程序
==================================
#include <stdio.h>;
#include <stdlib.h>;
#include <sys/wait.h>;
#include <sys/types.h>;

int main()
{

pid_t status ;

int errno = 0 ;
        status = system("./rt") ;

printf("wifexited(status):%d/n",WIFEXITED(status));
printf("WEXITSTATUS(status):%d/n",WEXITSTATUS(status));
        if (status == -1)
                printf("system error!") ;

if (WIFEXITED(status)){
                printf("cp exit normal![%d]/n", errno) ;
                printf("exit staus = [%X]/n", WEXITSTATUS(status)) ;
        }else
                printf("cp exit illegal![%d]/n", errno) ;
}
~
[tiantao@probe sys_test]$ cat sys_test.cpp
#include <stdio.h>;
#include <stdlib.h>;
#include <sys/wait.h>;
#include <sys/types.h>;

int main()
{
       
        pid_t status ;
       
       int errno = 0 ;
        status = system("./rt") ;
       
printf("wifexited(status):%d/n",WIFEXITED(status));//非零代表system执行正常
printf("WEXITSTATUS(status):%d/n",WEXITSTATUS(status));//是指令的返回值
        if (status == -1)
                printf("system error!") ;
       
        if (WIFEXITED(status)){
                printf("cp exit normal![%d]/n", errno) ;
                printf("exit staus = [%X]/n", WEXITSTATUS(status)) ;
        }else
                printf("cp exit illegal![%d]/n", errno) ;
}

==================================
编译后运行结果
==================================
Return 10.
wifexited(status):1
WEXITSTATUS(status):10
cp exit normal![0]
exit staus = [A]
==================================
可以看到:
WEXITSTATUS(status)可以得到调用程序的返回值。

system函数返回值相关推荐

  1. system函数返回值探究

    http://blog.chinaunix.net/uid-24774106-id-3048281.html?page=3 遇到system调用脚本,结果返回了256的情况,那么如何判断脚本是否正常成 ...

  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. 在switch case 语句中能否使用continue 关键字?为什么?
  2. 云原生不仅颠覆了技术栈,背后的每个岗位也在悄然发生改变
  3. 【Spring学习】IOC容器
  4. IDEA报错:Loading class `com.mysql.jdbc.Driver‘. This is deprecated. The new driver class is `com.mysql
  5. LeetCode 2000. 反转单词前缀
  6. 预测分析算法的设计与实现_基于LD(编辑距离算法)的单词速记数据库分析设计与实现...
  7. 差异表达基因变化倍数_10.limma教程|差异表达统计相关理论
  8. SpringMVC处理异常
  9. ffmpeg输出yuv的函数堆栈(h264)
  10. [leetcode] 872. 叶子相似的树(周赛)
  11. mybatis加载属性
  12. 「leetcode」617. 合并二叉树:【三种递归】【一种迭代】详解
  13. php 删除服务器指定目录图片
  14. 自然辩证法小论文选题_新颖的自然辩证法论文题目 自然辩证法论文题目哪个好...
  15. ds90ub934 i2c 配置_DS90UB934-Q1 25MHz 至 100MHz 10/12 位 FPD-Link III 串行器和解串器
  16. Shopnc之nginx安装
  17. 域用户指定计算机,什么是AD域,如何设置AD域用户仅登录到指定的计算机
  18. Windows原版系统下载地址
  19. 通过MERL100计算Blender Disney BRDF参数
  20. 【分析】编程和数学是什么关系?为什么编程学习这么火?

热门文章

  1. 关于Out of the box翻译【待整理】
  2. 硬核“保镖”,“御享财富”用事实说话
  3. java师傅的名人名言
  4. 银企直联和企业网银的区别
  5. 纽约时报称莫言获诺贝尔奖打破欧洲作家垄断-莫言-诺贝尔文学奖-村上春树
  6. 计算机管理检查表,系统管理员工作流程检查表_演练使用
  7. Survivor区放不下存活对象,那么存活对象直接就分配到老年代?
  8. django ImageField使用默认图片
  9. 九宫格抽奖- 前后端代码
  10. Nginx 解决跨域