как перенаправить вывод команды терминала через execve в std :: string в c ++ - PullRequest
0 голосов
/ 14 марта 2020

Я хочу перенаправить вывод от выполнения команды в терминале на строку в c ++. Я не хочу, чтобы вывод команды вообще появлялся в терминале, потому что я использую отображение ncurses. Есть ли способ, которым я могу это сделать?

Я использую терминал Linux.

Я подумал о перенаправлении во временный файл, а затем чтение содержимого файла. Но я бы предпочел не вводить файлы tmp. чтобы уточнить, я хочу быть в состоянии сделать следующее:

  1. echo "hello world" через execve
  2. перенаправить вывод из терминала в std :: string, так что на самом деле он не отображается в терминале на этом этапе.
  3. использовать функцию printw в ncurses для вывода вывода команды в окно ncurses

В настоящее время я ищу возможные реализации с использованием особенности из термина ios .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");

Использование потока строк не работает.

1 Ответ

0 голосов
/ 14 марта 2020

Хорошей альтернативой является использование заголовочного файла pstream вместо execve, который создает дочерний процесс.

благодаря этому сообщению:

{ ссылка }

Вместо использования exe c я записываю вывод и печатаю его, используя метод printc ncurses:

  // 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");
  }

здесь pstreams: http://pstreams.sourceforge.net/

...