C++ 获取linux系统指令的输出结果

本文介绍了一种在C++程序中调用并获取Linux系统命令结果的方法,使用popen、pclose和fgets函数,实现了获取cmd指令运算结果并保存至字符串的功能。

在arm上嵌入式开发的时候遇到了一个这样的问题,实现的功能是正确的,但是在运行过程中,同一个算子在计算的时候会随机出现计算错误的现象;为了快速的还原错误环境,就需要将计算的结果和正确的结果对比;由于数据量比较大,所以采用的是保存到文件中,利用md5sum去对比。但是在运行C++程序的时候,需要获取Linux系统指令运行的结果,故写下了这边博客。
需要用到C中的popen、pclose、fgets三个函数接口,如下所示:

   1. FILE * popen(const char * command, const char * type)

           头文件:#include <stdio.h>

           函数说明:popen()会调用fork()产生子进程,然后从子进程中调用/bin/bash/sh -c 来执行参数command的指令。

           参数说明:

                   command:指令;

                   type:r调用进程读取command的标准输出;w调用进程写到command的标准输入;

           返回值说明:

                   如果成功返回文件指针,如果失败返回NULL,错误原因存于errno中。

   2. int pclose ( FILE * stream )

           头文件:#include <stdio.h>

           函数说明:用来关闭由popen所建立的管道及文件指针。

           参数说明:

                   stream:为popen()所返回的文件指针。

           返回值说明:

                   如果成功返回shell的终止状态,若出错返回-1,错误原因,原因存于errno中。

  3. char *fgets(char *str, int n, FILE *stream) 

           头文件:#include <stdio.h>

           函数说明:从指定的流stream读取一行,并把它存储在str所指向的字符串内。当读取(n-1)个字符时,或读取到换行符时,或者到达文件末尾,会停止。

           参数说明:

                   str:指向一个字符数组的指针,该数组存储了要读取的字符串;

                   n:读取的最大字符数。通常为str的数组长度

                   stream:指向FILE对象的指针,该FILE对象标识了要从中读取字符的流

           返回值说明:

                   如果成功返回相同的str参数,如果到达文件末尾或者没有读取到任何字符,str的内容不良,并返回一个空指针,如果发生错误,返回一个空指针。

主要使用的函数已经做了简单的解释说明,下面直接是源码

/**
 *@用与获取cmd指令运算的结果,并将cmd执行后的输出结果保存到code中
 *@param[0] cmd 需要运行的指令
 *@param[1] code 将指令的输出结果保存在该字符串中
 **/
void aiden_system(const char *cmd, std::string& code)
{
    char result[10240] = {0};
    char buf[1024] = {0};
    FILE *fp = NULL;

    if( (fp = popen(cmd, "r")) == NULL ) {
        printf("popen error!\n");
        return;
    }

    while (fgets(buf, sizeof(buf), fp)) {
        strcat(result, buf);
    }

    pclose(fp);
    printf("result: %s\n", result);
    std::string code_ = std::string(result);
    code = std::string(result);
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值