将输出从bash脚本返回到调用C++函数

Rhu*_*rac 10 c++ linux bash

我正在为练习写一个婴儿计划.我想要完成的基本上是一个简单的小GUI,它显示服务(对于Linux); 使用按钮启动,停止,启用和禁用服务(类似于Windows中的msconfig应用程序"服务"选项卡).我在Fedora 21上使用C++和Qt Creator.

我想用C++创建GUI,并通过调用bash脚本在服务列表中填充GUI,并在按钮点击时调用bash脚本来执行相应的操作(启用,禁用等)

但是当C++ GUI调用bash脚本(使用system("path/to/script.sh"))时,返回值仅用于退出成功.如何接收脚本本身的输出,以便我可以反过来使用它在GUI上显示?

对于概念性示例:如果我试图将(systemctl --type service | cut -d " " -f 1)的输出显示到我用C++创建的GUI中,我该怎么做?这甚至是我正在努力完成的正确方法吗?如果不,

  1. 什么是正确的方法?和
  2. 还有办法使用我当前的方法吗?

我已经找到了解决这个问题的方法,但我找不到有关如何将值 Bash 返回 C++的信息,只能找到如何从C++ 调用 Bash脚本的信息.

Mee*_*tan 8

我们将在popen这里利用这个功能.

std::string exec(char* cmd) {
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[128];
    std::string result = "";
    while(!feof(pipe)) {
        if(fgets(buffer, 128, pipe) != NULL)
            result += buffer;
    }
    pclose(pipe);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

此函数将命令作为参数,并将输出作为a返回 string.

注意:不会捕获stderr!一个快速简便的解决方法是在命令结束时 stderr 重定向到stdout 2>&1.

是文档popen.快乐编码:)


Ibr*_*him 5

您必须使用popen而不是运行命令system,然后循环返回的文件指针。

这是该命令的一个简单示例ls -l

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *process;
    char buff[1024];

    process = popen("ls -l", "r");

    if (process != NULL) {
        while (!feof(process)) {
            fgets(buff, sizeof(buff), process);
            printf("%s", buff);
        }

        pclose(process);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)