如何通过execve将终端命令输出重定向到C++中的std::string

how to redirect terminal command output via execve to std::string in c++

我想将在终端中执行命令的输出重定向到 C++ 中的字符串。我根本不希望命令输出出现在终端中,因为我使用的是 ncurses 显示器。 我有什么办法可以做到这一点吗?

我正在使用 Linux 终端。

我考虑过重定向到临时文件然后读取文件的内容。但我宁愿不介绍 tmp 文件。 澄清一下,我希望能够做到以下几点:

  1. 回显 "hello world" 通过 execve
  2. 将终端的输出重定向到 std::string,这样它实际上不会在这个阶段显示在终端中。
  3. 使用 ncurses 中的 printw 函数将命令输出打印到 ncurses window

我目前正在寻找使用来自 termios.h 和可能的 dup2

的功能的可能实现

我的代码如下所示:

std::string containerForOutput;


// some method which redicects execve into containerForOutput here

char cmd[100];
strcpy(cmd, "/usr/bin/");
strcat(cmd, argv[0]);

// execute the command using execve, but
// will not output to terminal after command is given
// and will instead store it in the string containerForOutput
int result = execve(cmd, argv, environ);
perror("Fallback Shell");

使用字符串流无效。

一个好的替代方法是使用 pstream 头文件而不是 execve,这会创建一个子进程。

多亏了这个post:

我捕获输出并使用 ncurses printw 方法打印它,而不是使用 exec:

  // run a process and create a streambuf that reads its stdout and stderr
  redi::ipstream proc("echo hello", redi::pstreams::pstdout | redi::pstreams::pstderr);
  std::string line;
  // read child's stdout
  while (std::getline(proc.out(), line)) {
   // the output is captured line by line here
   // so that i can do what i want with it
    printw(line.c_str());
    printw("\n");
  }

  // if reading stdout stopped at EOF then reset the state:
  if (proc.eof() && proc.fail()) {
    proc.clear();
  }
  // read child's stderr
  while (std::getline(proc.err(), line)) {
   // error message is captured line by line here
   // so that i can do what i want with it.
    printw(line.c_str());
    printw("\n");
  }

pstream 在这里: http://pstreams.sourceforge.net/