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>  
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的错误信息了。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值