linux c 执行shell命令并获取返回结果
最近在项目中用到了C语言执行shell命令的问题,调查了一下,一般有system函数、exec族函数,但是还不太清楚怎么获取shell命令执行的返回信息。
例如执行一个ifconfig命令,肯定需要获取ifconfig命令的返回值的。
接着调查的话,发现有一个popen函数,也可以执行shell命令,并且可以获取shell命令执行的返回信息。
man popen可以看到:
#include <stdio.h>
FILE *popen(const char *command, const char *type);int pclose(FILE *stream);
示例:
#include<stdio.h>
#include<string.h>
#include<errno.h>int main(int argc,char*argv[]){ FILE *fstream=NULL; char buff[1024]; memset(buff,0,sizeof(buff)); if(NULL==(fstream=popen("ifconfig","r"))) { fprintf(stderr,"execute command failed: %s",strerror(errno)); return -1; } while(NULL!=fgets(buff, sizeof(buff), fstream)) {printf("%s",buff); }pclose(fstream); return 0;
}
用这个示例测试一个mount命令,一不小心把ip地址弄错了,结果到了pclose时,好长时间都没有返回。
查看了一些资料,发现popen是创建一个子进程执行shell命令,用pclose销毁子进程并回收资源,所以pclose会一直等待子进程的退出。
所以在用popen执行某个shell命令时,最好可以让该shell命令可以在一定时间内返回。
补充一点:
在用popen执行mount命令时,用上述代码无法捕获mount的错误信息。
例如故意将mount的参数写错,在用fgets时,无法获取到mount的错误信息;虽然在终端上可以看到mount的错误信息,但是fgets无法获取。
想到是不是mount的错误信息没有输出到stdout,为了证实猜测,就在mount命令的最后加上了2>&1,就是错误信息重定向到stdout,结果fgets就可以获取到mount的错误信息了。
linux c 执行shell命令并获取返回结果相关推荐
- java连接linux服务器执行shell命令(框架分析+推荐)
java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...
- c#执行cmd命令并获取返回结果字符串
全栈工程师开发手册 (作者:栾鹏) c#教程全解 c#执行cmd命令并获取返回结果字符串 测试代码 static void Main() {string back=execCMD("ipco ...
- java执行cmd命令并获取返回结果字符串
全栈工程师开发手册 (作者:栾鹏) java教程全解 java执行cmd命令并获取返回结果字符串 测试代码 public static void main(String[] args) {String ...
- linux shell 命令执行结果,如何通过程序执行shell命令并获取命令执行结果?
1 参考资料 1.[c/c++]如何调用[linux]shell命令行命令并获取命令行的输出内容(https://blog.csdn.net/youngstar70/article/details/7 ...
- C或C 如何通过程序执行shell命令并获取命令执行结果?
1 应用场景 最近在实际程序开发中,需要通过程序执行 shell 命令,并获取命令输出内容.但是系统自带的 system 只能返回命令执行成功与否,不能捕获命令输出. 2 扩展性 由于应用场景本就广泛 ...
- JSch连接不上Linux服务器,windows 下 java程序jsch连接远程linux服务器执行shell命令
java远程连接服务的shell需要使用SSH的登录方式,可以使用JSch技术.JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等. ...
- Android利用 libsuperuse执行shell命令或获取root权限
Android 5.1 之后,发现通过ActivityManger获取不到正在运行的进程了,可以通过shell命令来获取,参考. libsuperuse执行shell可以参考: http://my.o ...
- shell实现批量在多台windows服务器上执行同一命令并获取返回结果
1. 需求 在对windows服务器的运维当中,如果要查看当前的主机名.资源使用.软件安装情况等,大家是怎么操作呢,是登进去鼠标挨着点击查看,还是通过命令呢?貌似命令的方法比较专业一点.但是,如 ...
- 函数 —— popen() fscanf() sprintf() 执行shell命令并获取结果
对fopen()函数的理解如下: 表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * t ...
最新文章
- 字符扫描剑指Offer读书笔记之第二章2字符替换Strut2教程-java教程
- uni上传图片跨域_uni-app的项目实践心得
- 机器人弧焊焊钳型号_Delmia机器人仿真编程 第4节 创建资源库
- GitHub被中国人霸榜!国外开发者不开心了
- 数据库原理与应用(SQL Server)笔记 第五章 索引和视图
- 指定一个actor对pawn不可见
- 一个斐波那契数列题 HDU 2041
- 网络协议分析(Network Protocol Analysis)之IPCP、认证协议PAP与CHAP
- layer自动补全 select
- POJ 2739 Sum of Consecutive Prime Numbers 难度:0
- Atitti 摘要算法 散列算法SHA1 和 MD5 crc32 目录 1.1. CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长	1 1.1.1. 数据摘要算
- 介绍电子计算机的英文简介,写介绍电脑的英语作文
- ECharts怎样显示中国地图
- 数据总线,地址总线,控制总线
- 诺基亚、罗永浩,中国手机2014八大关键词
- Flutter pageview indicator指示器实现
- 教育行业下半场强势到来!专访FCG教育链Edward Cai:从互联网教学到“链教学”,让天下没有不公平的教育...
- 神经网络系统理论与实践,神经网络系统理论基础
- 微型计算机内储存比外储存,智慧职教: 微型计算机中内储存器比外储存器
- 关于PhotoShop工具栏失灵