Вы можете получить код возврата из канала с помощью пользовательского средства удаления:
вая следующий ответ (первый ответ 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");
) и получить стандартный вывод в строку.
Но что он не делает, так это получает код возврата команды (pass / fail integer) или stderr. В идеале я хотел бы получить способ получить все три (код возврата, стандартный вывод, стандартный вывод).
Я бы согласился на stdout и stderr. Я думаю, что мне нужно добавить еще один канал, но я не могу понять, как настроен первый канал, чтобы получить стандартный вывод, поэтому я не могу думать, как бы изменить его, чтобы получить оба.
У кого-нибудь есть идеи, как это сделать, или альтернативные подходы, которые могут работать?
Обновить
Смотрите мой полный примерВот с выводом:
Start
1 res: /home
2 res: stdout
stderr
3 res:
End
Ты это видишь3 res:
не печатает stderr так же, как2 res: stdout
делает, но stderr просто выводится на экран отдельной строкой процесса (а не моей программы).
Внешние Libs
Я действительно не хочу использовать внешние библиотеки, такие как Qt и boost - в основном потому, что я хочу их переносимость, а также многие проекты, над которыми я работаю, не используют boost. Однако я отмечу решения, которые содержат эти параметры, так как они действительны для других пользователей :)
Полное решение с использованием комментариев / ответа
Спасибо всем за ваши ответы / комментарии, вот модифицированное решение (и работоспособное):