C++ Stream Implementierung von waqas Antwort:
#include
#include
#include
#include
#include
#include
#include
class execbuf : public std::streambuf {
protected:
std::string output;
int_type underflow(int_type character) {
if (gptr() < egptr()) return traits_type::to_int_type(*gptr());
return traits_type::eof();
}
public:
execbuf(const char* command) {
std::array buffer;
std::unique_ptr pipe(popen(command, "r"), pclose);
if (!pipe) {
throw std::runtime_error("popen() failed!");
}
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
this->output += buffer.data();
}
setg((char*)this->output.data(), (char*)this->output.data(), (char*)(this->output.data() + this->output.size()));
}
};
class exec : public std::istream {
protected:
execbuf buffer;
public:
exec(char* command) : std::istream(nullptr), buffer(command, fd) {
this->rdbuf(&buffer);
}
};
Dieses Code fängt alle Ausgaben über stdout
ab. Wenn Sie nur stderr
abfangen möchten, geben Sie Ihren Befehl wie folgt ein:
sh -c '' 2>&1 > /dev/null
Wenn Sie sowohl stdout
als auch stderr
abfangen möchten, sollte der Befehl so aussehen:
sh -c '' 2>&1
3 Stimmen
Auch siehe Antworten in dieser Frage:
https://stackoverflow.com/questions/52164723/how-to-execute-a-command-and-get-return-code-stdout-and-stderr-of-command-in-c
für eine Erweiterung der großartigen Antwort unten, die Methoden zum Abrufen desRückgabecodes
und vonstderr
sowiestdout
bereitstellt, die diese Antwort bereits erklärt.8 Stimmen
@code_fodder Sie können einen Link zu stackoverflow.com/questions/52164723/… erstellen.
1 Stimmen
Hier sind 5 Fragen und Antworten für C und/oder C++, die dieses Thema betreffen: 1) wie man aus stdout in C liest, 2) C: Führen Sie ein Systemkommando aus und erhalten Sie die Ausgabe?, 3) Wie kann ich ein externes Programm aus C heraus ausführen und seine Ausgabe analysieren?, 4) Optimales Erfassen von stdout aus einem system() Befehl, 5) (diese Frage).