最近在项目中用到了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命令并获取返回结果相关推荐

  1. java连接linux服务器执行shell命令(框架分析+推荐)

    java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...

  2. c#执行cmd命令并获取返回结果字符串

    全栈工程师开发手册 (作者:栾鹏) c#教程全解 c#执行cmd命令并获取返回结果字符串 测试代码 static void Main() {string back=execCMD("ipco ...

  3. java执行cmd命令并获取返回结果字符串

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java执行cmd命令并获取返回结果字符串 测试代码 public static void main(String[] args) {String ...

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

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

  5. C或C 如何通过程序执行shell命令并获取命令执行结果?

    1 应用场景 最近在实际程序开发中,需要通过程序执行 shell 命令,并获取命令输出内容.但是系统自带的 system 只能返回命令执行成功与否,不能捕获命令输出. 2 扩展性 由于应用场景本就广泛 ...

  6. JSch连接不上Linux服务器,windows 下 java程序jsch连接远程linux服务器执行shell命令

    java远程连接服务的shell需要使用SSH的登录方式,可以使用JSch技术.JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等. ...

  7. Android利用 libsuperuse执行shell命令或获取root权限

    Android 5.1 之后,发现通过ActivityManger获取不到正在运行的进程了,可以通过shell命令来获取,参考. libsuperuse执行shell可以参考: http://my.o ...

  8. shell实现批量在多台windows服务器上执行同一命令并获取返回结果

    1.    需求 在对windows服务器的运维当中,如果要查看当前的主机名.资源使用.软件安装情况等,大家是怎么操作呢,是登进去鼠标挨着点击查看,还是通过命令呢?貌似命令的方法比较专业一点.但是,如 ...

  9. 函数 —— popen() fscanf() sprintf() 执行shell命令并获取结果

    对fopen()函数的理解如下: 表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * t ...

最新文章

  1. 字符扫描剑指Offer读书笔记之第二章2字符替换Strut2教程-java教程
  2. uni上传图片跨域_uni-app的项目实践心得
  3. 机器人弧焊焊钳型号_Delmia机器人仿真编程 第4节 创建资源库
  4. GitHub被中国人霸榜!国外开发者不开心了
  5. 数据库原理与应用(SQL Server)笔记 第五章 索引和视图
  6. 指定一个actor对pawn不可见
  7. 一个斐波那契数列题 HDU 2041
  8. 网络协议分析(Network Protocol Analysis)之IPCP、认证协议PAP与CHAP
  9. layer自动补全 select
  10. POJ 2739 Sum of Consecutive Prime Numbers 难度:0
  11. Atitti 摘要算法 散列算法SHA1 和 MD5  crc32 目录 1.1. CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长 1 1.1.1. 数据摘要算
  12. 介绍电子计算机的英文简介,写介绍电脑的英语作文
  13. ECharts怎样显示中国地图
  14. 数据总线,地址总线,控制总线
  15. 诺基亚、罗永浩,中国手机2014八大关键词
  16. Flutter pageview indicator指示器实现
  17. 教育行业下半场强势到来!专访FCG教育链Edward Cai:从互联网教学到“链教学”,让天下没有不公平的教育...
  18. 神经网络系统理论与实践,神经网络系统理论基础
  19. 微型计算机内储存比外储存,智慧职教: 微型计算机中内储存器比外储存器
  20. 关于PhotoShop工具栏失灵

热门文章

  1. 开关电源 误差放大器电路
  2. JavaScript强化教程——JavaScript 运算符
  3. 理解和配置 Linux 下的 OOM Killer
  4. eclipse 快捷键汇总
  5. C++ 容器vector的范例学习
  6. jQuery MD5加密
  7. laravel的工厂模式数据填充:
  8. L2:grep使用正则表达式
  9. Windows 远程桌面管理
  10. Delphi 2010 安装及调试