1 应用场景

最近在实际程序开发中,需要通过程序执行 shell 命令,并获取命令输出内容。但是系统自带的 system 只能返回命令执行成功与否,不能捕获命令输出。

2 扩展性

由于应用场景本就广泛,因此扩展性较好。

此函数可以执行任意命令,并捕获命令输出结果。

实际使用过程中可以把此函数作为最底层接口,然后层层封装,实现自己想要的功能。

3 测试环境

3.1 Ubuntu

找到此方法时,我首先在 Ubuntu 中进行了测试,环境如下:

  • 系统版本:Ubuntu 14.04.1 LTS

  • 系统版本详细信息如下

1zhaoc@ubuntu14:~$ lsb_release -a
2No LSB modules are available.
3Distributor ID:    Ubuntu
4Description:    Ubuntu 14.04.1 LTS
5Release:    14.04
6Codename:    trusty
  • 系统内核版本如下

1zhaoc@ubuntu14:~$ uname -a
2Linux ubuntu14 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
  • gcc 版本如下

1gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 

3.2 工程代码

随后又放到工程代码中测试,环境如下:

  • 系统内核版本如下

1[root]#uname -a
2Linux itl 4.4.207  #24 PREEMPT Fri Jan 29 18:09:37 CST 2021 armv5tejl GNU/Linux
  • gcc 版本如下

1gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)
  • 使用 C 标准:C 11

4 函数原型

根据参考资料,优化后的函数原型如下

 1#include 2#include 34#define CMD_RESULT_BUF_SIZE 102456/*7 * cmd:待执行命令8 * result:命令输出结果9 * 函数返回:0 成功;-1 失败;
10 */
11int ExecuteCMD(const char *cmd, char *result)
12{
13    int iRet = -1;
14    char buf_ps[CMD_RESULT_BUF_SIZE];
15    char ps[CMD_RESULT_BUF_SIZE] = {0};
16    FILE *ptr;
17
18    strcpy(ps, cmd);
19
20    if((ptr = popen(ps, "r")) != NULL)
21    {
22        while(fgets(buf_ps, sizeof(buf_ps), ptr) != NULL)
23        {
24           strcat(result, buf_ps);
25           if(strlen(result) > CMD_RESULT_BUF_SIZE)
26           {
27               break;
28           }
29        }
30        pclose(ptr);
31        ptr = NULL;
32        iRet = 0;  // 处理成功
33    }
34    else
35    {
36        printf("popen %s error\n", ps);
37        iRet = -1; // 处理失败
38    }
39
40    return iRet;
41}

查看源码中的 popen() 、pclose() 函数原型定义如下:

 1#if (defined __USE_POSIX2 || defined __USE_SVID  || defined __USE_BSD || \2     defined __USE_MISC)3/* Create a new stream connected to a pipe running the given command.45   This function is a possible cancellation point and therefore not6   marked with __THROW.  */7extern FILE *popen (const char *__command, const char *__modes) __wur;89/* Close a stream opened by popen and return the status of its child.
10
11   This function is a possible cancellation point and therefore not
12   marked with __THROW.  */
13extern int pclose (FILE *__stream);
14#endif

查看源码中的 fgets() 函数原型如下:

1/* Get a newline-terminated string of finite length from STREAM.
2
3   This function is a possible cancellation point and therefore not
4   marked with __THROW.  */
5extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
6     __wur;

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C或C 如何通过程序执行shell命令并获取命令执行结果?相关推荐

  1. Shell脚本中获取命令运行结果、特殊变量使用、条件判断等常用操作

    文章目录 前言 获取命令执行结果 使用反引号 `` ` ``command `` ` ``来执行命令 使用括号组合 $(command) 来执行命令 两种方式的区别 特殊变量使用 $0 $1 $2 . ...

  2. linux shell 命令执行结果,如何通过程序执行shell命令并获取命令执行结果?

    1 参考资料 1.[c/c++]如何调用[linux]shell命令行命令并获取命令行的输出内容(https://blog.csdn.net/youngstar70/article/details/7 ...

  3. php查看mysql最近执行过的sql_PHP获取MySQL执行sql语句的查询时间

    //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function runtime($mode=0 ...

  4. linux执行shell过程日志,Android之在linux终端执行shell脚本直接打印当前运行app的日志...

    1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 a ...

  5. 如何指定在Git上执行shell命令时使用的私有SSH密钥?

    也许是一个相当不寻常的情况,但我想指定一个私有SSH密钥,以便在从本地计算机执行shell(git)命令时使用. 基本上是这样的: git clone git@github.com:TheUser/T ...

  6. Linux 定时执行shell 脚本

    2019年第 85 篇文章,总第 109 篇文章 本文大约2000字,阅读大约需要6分钟 crontab 可以在指定的时间执行一个shell脚本以及执行一系列 Linux 命令. 定时执行shell ...

  7. java执行shell命令权限不够_Java调用shell脚本解决传参和权限问题的方法|chu

    1. java 执行shell java 通过 Runtime.getRuntime().exec() 方法执行 shell 的命令或 脚本,exec()方法的参数可以是脚本的路径也可以是直接的 sh ...

  8. jenkins 执行shell命令 command not found,make: *** [build] Error 127 解决办法

    本地执行shell命令成功,Jenkins 远程执行 shell命令有时 提示命令找不到,或者make的时候报错. 因为Jenkins执行shell时无法获取环境变量的原因导致 解决办法在shell脚 ...

  9. adb shell读取返回值_android代码执行adb shell终端命令(linux命令)并返回执行结果...

    在做Android开发板相关的开发需求的时候,我们有的时候需要去到Android系统的一个linux终端(adbshell)里面来执行一些命令,以便于查看部分文件内容或者修改部分文件权限等需求,通常我 ...

最新文章

  1. JBoss下布署Spring2.5和Struts2系统
  2. VM:如何向vmware虚拟机中传输文件(或者共享文件夹)之详细攻略(图文教程)
  3. 【干货】搭建社区运营团队的一些经验和“血的教训”
  4. 如何配置html prettify,[HTML] Prettify 代码高亮使用总结
  5. php监听mq消息,客户端监听服务端获取rabbitmq消息队列,rabbitmq有消息的时候客户端刷新页面才能获取到消息,监听没起到作用,请求各位大神指点迷津...
  6. [Ubuntu]Apt-get命令参数详解
  7. postmapping注解参数说明_从零搭建后端框架:优雅的参数校验Validator
  8. ui测试怎么做?依据文档有哪些_微信小程序开发流程有哪些?各个环节注意事项...
  9. 如何修复:There is no command installed for 7-zip archive files
  10. git(7)---Git cherry-pick
  11. Muduo 网络编程示例之三:定时器
  12. mysql 8安装 windows xp_postgreSQL[Windows XP]安装问题解决方案:
  13. 《中国电子报》访极通研发总监梁绍博
  14. 安卓ttf格式的字体包_【新品】比百思不得姐细一点的小粗黑丨正常大小+小字体...
  15. linux安装teamviewer黑屏,如何在CentOS 7上安装TeamViewer
  16. 在OpenGL中实现Geometry Instancing
  17. 把OctoberCMS的web服务器由Apache更换为Nginx
  18. 区间问题,Huffman树,排序不等式,绝对值不等式,推公式
  19. 深入分析 Java Web 中的中文编码问题
  20. 计算机硬件全面测试工具,电脑硬件全面检测工具 HWiNFO32 2.30

热门文章

  1. lambda 函数式编程_Java 8 Lambda表达式的函数式编程– Monads
  2. Spring Setter依赖注入示例
  3. java备忘录_Java 8备忘单中的可选
  4. jclouds_使用jclouds在S3上分段上传
  5. Spring Security和自定义密码编码
  6. jaxb 处理_休息使用Jersey –包含JAXB,异常处理和客户端程序的完整教程
  7. osgi 模块化_OSGI –模块化您的应用程序
  8. Java Micro Framework:您无法忽略的新趋势
  9. 从jHiccup开始
  10. 提高Java的锁性能