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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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);
}
C++中,你可以通过`<cstdlib>`头文件中的`system()`函数或者`<iostream>`下的`std::stringstream`结合`popen()`函数来执行Linux系统命令,并获取其标准输出(stdout)和标准错误输出(stderr)。下面是一个简单的示例: ```cpp #include <cstdlib> #include <sstream> #include <cstdio> int main() { // 执行命令(这里以ls -l作为例子) const char* command = "ls -l"; FILE *output = popen(command, "r"); // "r"参数表示读取 if (!output) { std::cerr << "Failed to execute the command!" << std::endl; return 1; // 返回值表示退出状态 } // 获取标准输出和错误输出 std::string stdout_string, stderr_string; char buffer[1024]; while (fgets(buffer, sizeof(buffer), output)) { if (feof(output)) break; // EOF标志检查 if (strstr(buffer, "error")) { // 根据需要判断是否是错误输出 stderr_string += buffer; } else { stdout_string += buffer; } } // 关闭流 pclose(output); // 打印结果 std::cout << "Standard Output:\n" << stdout_string << std::endl; std::cerr << "Error Output:\n" << stderr_string << std::endl; // 从系统命令返回值获取退出码(Unix/Linux) int exit_code = WEXITSTATUS(waitpid(-1, NULL, 0)); std::cout << "Exit code: " << exit_code << std::endl; return exit_code; } ``` 在这个示例中,我们首先使用`popen()`打开一个指向命令行输入/输出的管道,然后通过`fgets()`逐行读取输出。`WEXITSTATUS()`函数用于从waitid系统调用中提取进程的退出状态码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值