如何将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
相关产品推荐
相关产品推荐

