首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[C++][linux]C++调用shell并获取返回值

[C++][linux]C++调用shell并获取返回值

作者头像
git clone firc-dataset
发布2025-07-19 14:26:01
发布2025-07-19 14:26:01
5030
举报

实例:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <iostream>
int main(){
    char outBuffer[1024];  // 保存运行后输出的结果
    char *cmdStr = "ls .";  // 准备运行的命令
    FILE * pipeLine = popen(cmdStr,"r");  // 建立流管道
    if(!pipeLine){  // 检测流管道
        perror("Fail to popen\n");
        return 1;
    }
    while(fgets(outBuffer, 1024, pipeLine) != NULL){ // 获取输出
        printf("输出: %s",outBuffer); // 打印输出
    }
    pclose(pipeLine); 
    return 0;
}

但是有时候我们利用上面命令却获取不到输出,这是因为有的程序是在stderr上进行输出的,比如ffmpeg,因此可以改成类似下面的代码:

popen创建的管道,默认读取的是标准输出stdout,但很多程序(如ffmpeg相关的)输出到stderr上,为了能方便地读取这些输出,需要在执行命令时,对输出做重定向( 2>&1)。

int RunCmd(std::string strCmd, PFunCommandOutput funOut) {     FILE *fp = NULL;     char data[1024] = {0};     LOG(INFO) << "To popen: " << strCmd;     strCmd += " 2>&1";     fp = popen(strCmd.c_str(), "r");     if (NULL == fp) {         LOG(ERROR) << "popen " << strCmd << " fail: " << errno;         return -1;     }     while (fgets(data, sizeof(data), fp) != NULL) {         if (NULL != funOut) {             funOut(data);         }     }     return pclose(fp)

执行命令的输出信息,通过回调函数返回给调用者;当命令执行完成后,函数会返回命令的执行结果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档