Учитывая следующий ответ (первый ответ c ++ 11):
Как выполнить команду и получить вывод команды в C ++, используя POSIX?
Вот реализация для вашего удобства:
#include <cstdio>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <array>
std::string exec(const char* cmd) {
std::array<char, 128> buffer;
std::string result;
std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose);
if (!pipe) throw std::runtime_error("popen() failed!");
while (!feof(pipe.get())) {
if (fgets(buffer.data(), 128, pipe.get()) != nullptr)
result += buffer.data();
}
return result;
}
Это очень хорошо работает для выполнения команды (например, std::string res = exec("ls");
) и получения stdout в строку.
Но что он не делает, так это получает код возврата команды (pass / fail integer) или stderr. В идеале мне нужен способ получить все три (код возврата, стандартный вывод, стандартный вывод).
Я бы согласился на стандартный вывод и стандартный вывод. Я думаю, что мне нужно добавить еще один канал, но я не могу понять, как настроен первый канал, чтобы получить стандартный вывод, поэтому я не могу думать, как бы изменить его, чтобы получить оба.
У кого-нибудь есть идеи, как это сделать, или альтернативные подходы, которые могут работать?
обновление
Смотрите мой полный пример здесь с выводом:
Start
1 res: /home
2 res: stdout
stderr
3 res:
End
Вы можете видеть, что 3 res:
не печатает stderr так же, как 2 res: stdout
, но stderr просто выводится на экран отдельной строкой процесса (а не моей программы).
Внешние библиотеки
Я действительно не хочу использовать внешние библиотеки, такие как Qt и boost - в основном потому, что мне нужна его переносимость, а также многие проекты, над которыми я работаю, не используют boost. Однако я отмечу решения, которые содержат эти параметры, так как они действительны для других пользователей:)
Полное решение с использованием комментариев / ответов
Спасибо всем за ваши ответы / комментарии, вот модифицированное решение (и работоспособное):
работоспособное решение