C或C 如何通过程序执行shell命令并获取命令执行结果?
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命令并获取命令执行结果?相关推荐
- Shell脚本中获取命令运行结果、特殊变量使用、条件判断等常用操作
文章目录 前言 获取命令执行结果 使用反引号 `` ` ``command `` ` ``来执行命令 使用括号组合 $(command) 来执行命令 两种方式的区别 特殊变量使用 $0 $1 $2 . ...
- linux shell 命令执行结果,如何通过程序执行shell命令并获取命令执行结果?
1 参考资料 1.[c/c++]如何调用[linux]shell命令行命令并获取命令行的输出内容(https://blog.csdn.net/youngstar70/article/details/7 ...
- php查看mysql最近执行过的sql_PHP获取MySQL执行sql语句的查询时间
//计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function runtime($mode=0 ...
- linux执行shell过程日志,Android之在linux终端执行shell脚本直接打印当前运行app的日志...
1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 a ...
- 如何指定在Git上执行shell命令时使用的私有SSH密钥?
也许是一个相当不寻常的情况,但我想指定一个私有SSH密钥,以便在从本地计算机执行shell(git)命令时使用. 基本上是这样的: git clone git@github.com:TheUser/T ...
- Linux 定时执行shell 脚本
2019年第 85 篇文章,总第 109 篇文章 本文大约2000字,阅读大约需要6分钟 crontab 可以在指定的时间执行一个shell脚本以及执行一系列 Linux 命令. 定时执行shell ...
- java执行shell命令权限不够_Java调用shell脚本解决传参和权限问题的方法|chu
1. java 执行shell java 通过 Runtime.getRuntime().exec() 方法执行 shell 的命令或 脚本,exec()方法的参数可以是脚本的路径也可以是直接的 sh ...
- jenkins 执行shell命令 command not found,make: *** [build] Error 127 解决办法
本地执行shell命令成功,Jenkins 远程执行 shell命令有时 提示命令找不到,或者make的时候报错. 因为Jenkins执行shell时无法获取环境变量的原因导致 解决办法在shell脚 ...
- adb shell读取返回值_android代码执行adb shell终端命令(linux命令)并返回执行结果...
在做Android开发板相关的开发需求的时候,我们有的时候需要去到Android系统的一个linux终端(adbshell)里面来执行一些命令,以便于查看部分文件内容或者修改部分文件权限等需求,通常我 ...
最新文章
- JBoss下布署Spring2.5和Struts2系统
- VM:如何向vmware虚拟机中传输文件(或者共享文件夹)之详细攻略(图文教程)
- 【干货】搭建社区运营团队的一些经验和“血的教训”
- 如何配置html prettify,[HTML] Prettify 代码高亮使用总结
- php监听mq消息,客户端监听服务端获取rabbitmq消息队列,rabbitmq有消息的时候客户端刷新页面才能获取到消息,监听没起到作用,请求各位大神指点迷津...
- [Ubuntu]Apt-get命令参数详解
- postmapping注解参数说明_从零搭建后端框架:优雅的参数校验Validator
- ui测试怎么做?依据文档有哪些_微信小程序开发流程有哪些?各个环节注意事项...
- 如何修复:There is no command installed for 7-zip archive files
- git(7)---Git cherry-pick
- Muduo 网络编程示例之三:定时器
- mysql 8安装 windows xp_postgreSQL[Windows XP]安装问题解决方案:
- 《中国电子报》访极通研发总监梁绍博
- 安卓ttf格式的字体包_【新品】比百思不得姐细一点的小粗黑丨正常大小+小字体...
- linux安装teamviewer黑屏,如何在CentOS 7上安装TeamViewer
- 在OpenGL中实现Geometry Instancing
- 把OctoberCMS的web服务器由Apache更换为Nginx
- 区间问题,Huffman树,排序不等式,绝对值不等式,推公式
- 深入分析 Java Web 中的中文编码问题
- 计算机硬件全面测试工具,电脑硬件全面检测工具 HWiNFO32 2.30