You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Linux system()调用的输出仅重定向至变量,不输出到终端?

解决C++中执行系统命令时隐藏输出并获取结果的问题

首先得澄清一个关键误解:system()函数的返回值不是命令的输出内容,而是该命令执行后的退出状态码。你当前代码里的val拿到的是这条管道命令的执行状态(比如成功为0,失败为非0),而不是grep -c统计出的正在运行的sink输入数量。

要同时实现「不输出到终端」和「获取统计结果」这两个需求,推荐用popen()替代system()——它能创建管道来读取命令的标准输出,同时我们可以把命令的标准错误也重定向到/dev/null来彻底隐藏多余输出。

具体实现代码

#include <cstdio>
#include <cstdlib>

int main() {
    // 构造命令:将pacmd的错误输出重定向到/dev/null,同时捕获grep的统计结果
    const char* cmd = "pacmd list-sink-inputs 2>/dev/null | grep -c 'state: RUNNING'";
    
    // 以读模式打开管道,连接到命令的标准输出
    FILE* pipe = popen(cmd, "r");
    if (!pipe) {
        perror("Failed to create pipe");
        return EXIT_FAILURE;
    }
    
    char buffer[32];
    int running_sink_count = 0;
    // 读取命令输出的统计数字
    if (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
        // 将读取到的字符串转为整数
        running_sink_count = atoi(buffer);
    }
    
    // 关闭管道并获取命令的退出状态
    int exit_status = pclose(pipe);
    
    // 现在running_sink_count就是你需要的正在运行的sink输入数量
    // 整个过程不会有任何内容输出到终端
    
    return 0;
}

补充说明

如果你只是想单纯隐藏system()调用的输出(但依然拿不到统计数字),可以给命令加上输出重定向:

// 把命令的标准输出和错误输出都重定向到/dev/null,终端不会有输出,但val是命令的退出状态
int val = system("pacmd list-sink-inputs | grep -c 'state: RUNNING' >/dev/null 2>&1");

但显然这不符合你「获取统计值」的核心需求,所以优先推荐popen()的方案。

内容的提问来源于stack exchange,提问作者ytobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:11:46