我正在为练习写一个婴儿计划.我想要完成的基本上是一个简单的小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中,我该怎么做?这甚至是我正在努力完成的正确方法吗?如果不,
我已经找到了解决这个问题的方法,但我找不到有关如何将值从 Bash 返回到 C++的信息,只能找到如何从C++ 调用 Bash脚本的信息.
我们将在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.快乐编码:)
您必须使用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)
| 归档时间: |
|
| 查看次数: |
4214 次 |
| 最近记录: |