popen() schreibt die Ausgabe von Kommando ausgeführt, cout
Ich Schreibe eine Anwendung, öffnet sich ein weiterer Prozess und bekommen dessen Ausgabe. Online überall lese ich, ich habe mit popen
und aus der Datei gelesen.
Aber ich kann nicht von Ihr Lesen. Die Ausgabe von dem Befehl bekommt die Ausgabe in der Konsole-Fenster der aufrufenden Anwendung. Unten ist der code, den ich verwende. Ich habe einige Drucke zu Debuggen.
#include <string>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <array>
int main()
{
//some command that fails to execute properly.
std::string command("ls afskfksakfafkas");
std::array<char, 128> buffer;
std::string result;
std::cout << "Opening reading pipe" << std::endl;
FILE* pipe = popen(command.c_str(), "r");
if (!pipe)
{
std::cerr << "Couldn't start command." << std::endl;
return 0;
}
while (fgets(buffer.data(), 128, pipe) != NULL) {
std::cout << "Reading..." << std::endl;
result += buffer.data();
}
auto returnCode = pclose(pipe);
std::cout << result << std::endl;
std::cout << returnCode << std::endl;
return 0;
}
Lesen ist eigentlich nie gedruckt, um meine cout
und das Ergebnis ist ein leerer string. Ich sehe deutlich die Ausgabe des Befehls in meinem terminal. Wenn der Befehl ordnungsgemäß beendet werden, ist das Verhalten wie erwartet. Aber ich nur zu erfassen, die Ausgabe für Fehlerfälle.
feof()
zur Steuerung einer Schleife ist eine schlechte Praxis, und es ist sinnlos, in Ihrem Fall, da fgets()
zurück NULL
auf das Ende der Datei. Versuchen Sie bietet eine Minimale, Vollständige und Überprüfbare Beispiel, dass die Menschen verwenden können, um erstellen Sie Ihr problem. Wenn Sie nicht wissen, was das problem ist, dann bieten teilweise Informationen, wie Sie haben, ist ein guter Weg, lassen Sie sich wichtige Informationen. Es ist durchaus möglich, den Befehl, den Sie ausführen, ist mit einem bedeutet, dass der Ausgang, der nicht umleitbaren Ihre Technik.Vollständige Beispiel. Ich habe buchstäblich gerade Hinzugefügt int main und fügte hinzu, eine einprogrammierte Befehl...
InformationsquelleAutor John Smith | 2017-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Popen nicht einfangen stderr nur stdout. Umleiten von stderr zu stdout behebt das Problem.
InformationsquelleAutor John Smith
Müssen Sie "2" >&1" am Ende des Befehls-string
gibt es ein komplettes Beispiel, https://www.jeremymorgan.com/tutorials/c-programming/how-to-capture-the-output-of-a-linux-command-in-c/
InformationsquelleAutor Антон М