文章目录

  • 描述
  • 声明
  • 参数
  • 返回值
  • 实例
  • WIFEXITED/WEXITSTATUS函数
    • systerm两层含义
    • 函数实例
    • 详解解释
  • 参考资料

描述

C 库函数 int system(const char *command) 把 command 指定的命令名称或程序名称传给要被命令处理器执行的主机环境,并在命令完成后返回。

声明

下面是 system() 函数的声明。

#include <stdlib.h>
int system(const char *command)

参数

command – 包含被请求变量名称的 C 字符串。

返回值

如果发生错误,则返回值为 -1,否则返回命令的状态。

实例

#include <stdio.h>
#include <string.h>
#include<stdlib.h>int main ()
{char command[50];strcpy( command, "ls -l" );system(command);return(0);
}

WIFEXITED/WEXITSTATUS函数

systerm两层含义

1、正确退出后。还需要再判断,操作成功或者操作失败。
2、错误退出。

函数实例

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>  int main()
{  pid_t status;  status = system("./test.sh");  if (-1 == status)  {  printf("system error!");  }  else  {  printf("exit status value = [0x%x]\n", status);  if (WIFEXITED(status))  //正确退出{  if (0 == WEXITSTATUS(status)) //操作成功{  printf("run shell script successfully.\n");  }  else  //操作失败{  printf("run shell script fail, script exit code: %d\n", WEXITSTATUS(status));  }  }  else  //错误退出{  printf("exit status = [%d]\n", WEXITSTATUS(status));  }  }  return 0;
}

详解解释

1、先统一两个说法:

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

2、如何正确判断test.sh是否正确执行?

都错!(仅仅判断status是否==0?或者仅判断status是否!=-1? )

3、man中对于system的说明

4、system函数对返回值的处理。

阶段1:

创建子进程等准备工作。如果失败,返回-1。

阶段2:

调用/bin/sh拉起shell脚本,如果拉起失败或者shell未正常执行结束(参见备注1),原因值被写入到status的低8~15比特位中。
如何判断阶段2中,shell脚本是否正常执行结束呢?系统提供了宏:WIFEXITED(status)。如果WIFEXITED(status)为真,则说明正常结束。

阶段3:

如果shell脚本正常执行结束,将shell返回值填到status的低8~15比特位中。
如何取得阶段3中的shell返回值?你可以直接通过右移8bit来实现,但安全的做法是使用系统提供的宏:WEXITSTATUS(status)。

备注1:

只要能够调用到/bin/sh,并且执行shell过程中没有被其他信号异常中断,都算正常结束。

比如:

不管shell脚本中返回什么原因值,是0还是非0,都算正常执行结束。即使shell脚本不存在或没有执行权限,也都算正常执行结束。
 
如果shell脚本执行过程中被强制kill掉等情况则算异常结束。

参考资料

https://www.runoob.com/cprogramming/c-function-system.html
system/WIFEXITED/WEXITSTATUS函数-linux

C 库函数 system/WIFEXITED/WEXITSTATUS相关推荐

  1. system/WIFEXITED/WEXITSTATUS函数-linux

    system原型: 参数是命令, 命令行里敲的shell命令. 通过fork创建子进程后,在子进程中调用execl 来执行唤起 shell 进程 从而执行shell命令. systerm两层含义: 1 ...

  2. 14.system/WIFEXITED/WEXITSTATUS函数-linux

    system: 感性认识: systerm两层含义: 1.正确退出后.还需要再判断,操作成功或者操作失败. 2.错误退出. [cpp] view plaincopy #include <stdi ...

  3. c语言标准库函数system,C 库函数

    C 库函数 - system() 描述 C 库函数 int system(const char *command) 把 command 指定的命令名称或程序名称传给要被命令处理器执行的主机环境,并在命 ...

  4. system()与WIFEXITED/WEXITSTATUS/WIFSIGNALED

    system()用于执行shell命令 头文件 #i nclude<stdlib.h> 函数定义 int system(const char *command) ; 函数说明 system ...

  5. WIFEXITED WEXITSTATUS WIFSIGNALED

    http://blog.sina.com.cn/s/blog_636a55070101wtp5.html wait的函数原型是: #include #include pid_t wait(int *s ...

  6. wait, WIFEXITED, WEXITSTATUS

    wait的函数原型是: #include <sys/types.h> /* 提供类型pid_t的定义 */ #include <sys/wait.h> pid_t wait(i ...

  7. Linux下wait, WIFEXITED, WEXITSTATUS的比较

    偶尔翻到了这几个关键字,找到个文章复习了下:"http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part3/".记 ...

  8. 父进程等待子进程终止 wait, WIFEXITED, WEXITSTATUS

    wait()的函数原型是: #include <sys/types.h>   #include <sys/wait.h>  pid_t wait(int *status) [一 ...

  9. linux WIFEXITED WEXITSTATUS

    1,WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值. (请注意,虽然名字一样,这里的参数status并不同于wait唯一的参数–指向整数的指针st ...

最新文章

  1. switch和case的理解
  2. python windows系统调用_python日记第四章:python用os和sys模块进行系统调用
  3. Paxos与zookeeper
  4. 一个Java对象到底占用多大内存?
  5. 【快速安装Docker服务及Docker配置、Docker常用命令。】
  6. android action bar 风格,自定义ActionBar的风格
  7. 【tool】c/s和b/s的区别及实例说明
  8. 【Python煮音乐】MID文件转WAV
  9. 入侵服务器修改数据教程,入侵服务器 修改数据库
  10. 量子计算的人才、软件和硬件:解开你对量子的困惑
  11. 【numpy】TypeError: only size-1 arrays can be converted to Python scalars
  12. php生成临时文件,php生成zip压缩文件的方法详解
  13. ML.NET 示例:聚类之客户细分
  14. python语言的实验心得体会范文_关于实验的心得体会范文5篇
  15. java rsa 文件加密解密_RSA 加密、解密(自己生成加密解密文件)
  16. redis压测工具redis-benchmark
  17. 在小县城做什么生意好?
  18. Meta今年不再招人!小扎还说跳槽越多越好
  19. TADF材料的机制原理;TADF的机理;热活化延迟荧光如何产生?
  20. 网络协议:网络层传输层

热门文章

  1. JavaScript运用Canvas绘制心电图
  2. 开放平台的开发者如何赚钱
  3. ICSharpCode.TextEditor 实现获取光标所在行,在某行或某字符 处插入文本
  4. Qt笔记(二十六)之判断文件是否存在
  5. postgre sql 学习
  6. php 30岁 考研,26岁,你还会考研吗?毕业后都奔三了!不值得考研吗?
  7. 重磅:字节跳动张一鸣90亿布局元宇宙,下一个时代已经来临
  8. “大庆新铁人”什么精神值得我们学习
  9. AutoCAD LISP 绘制阿基米德螺线曲线
  10. 100个线程同时向一个银行账户中存入1元钱