Frage

Wie starte ich eine App und erfassen die Ausgabe über stdout und vielleicht Stderr?

Ich schreibe ein automatisiertes Build-System und ich brauche die Ausgabe zu erfassen zu analysieren. Ich möchte die SVN-Repo aktualisieren und die Revisionsnummer packen, damit ich die Dateien in Autobuild bewegen kann / revNumber / wenn sie erfolgreich sind. Ich würde auch die Kompilierung Text auf meinen Server für jedermann machen und laden bauen wie mit den Warnungen und Fehler auf einem ausgefallenen Build zu sehen.

Ich kann die system() Funktion finden, aber ich fand die CreateProcess() Funktion auf MSDN. Ich bin in der Lage zu starten, was ich brauche, aber ich habe keine Ahnung, wie die stderr und stdout zu erfassen. Ich stelle fest, das Verfahren separat startet, wenn ich einen Haltepunkt setzen und halten meine App spannendsten, die es dann in meiner app Konsolenfenster den gesamten Text zu halten. Ich möchte auch warten, bis alle Prozesse beendet sind und dann scannen die Daten, die es erzeugt keine zusätzlichen Operationen zu tun, was ich brauche. Wie mache ich irgendetwas davon?

War es hilfreich?

Lösung

In echten Muscheln (was bedeutet, nicht Muscheln - ich meine, nicht in C-Shell oder seine Derivate), dann:

program arg1 arg2 >/tmp/log.file 2>&1

Dieses Programm läuft mit den gegebenen Argumenten und leitet die stdout /tmp/log.file; die Notation ( Hieroglyphe ) '2>&1' am Ende sendet stderr (Dateideskriptor 2) an der gleichen Stelle, die (Dateideskriptor 1) stdout wird. Beachten Sie, dass die Folge von Operationen ist wichtig; wenn man sie umkehren, dann Standardfehler wird dorthin gehen, wo die Standardausgabe vorging, und dann die Standardausgabe (aber nicht Standardfehler) wird in die Datei umgeleitet werden.

Die Wahl des Dateinamen ist miserabel aus zahlreichen Gründen gezeigt -. Sie dem Benutzer das Verzeichnis wählen lassen sollen, und wahrscheinlich sollten den Prozess-ID oder Zeitstempel im Dateinamen enthalten

LOG=${TMPDIR:-/tmp}/log.$$.$(date +%Y%m%d-%H%M%S)
program arg1 arg2 >$LOG 2>&1

In C ++ können Sie die system() Funktion (geerbt von C) Prozesse laufen verwenden. Wenn Sie die Dateinamen in dem C ++ Programm (plausibel) wissen müssen, erzeugt dann den Namen im Programm (strftime() ist dein Freund) und die Befehlsfolge mit dem Dateinamen erstellen. (Streng genommen müssen Sie auch getenv() $ TMPDIR zu bekommen, und die POSIX-Funktion getpid() die Prozess-ID zu bekommen, und dann können Sie die zweizeilige Shell-Skript simulieren (obwohl die PID verwendet der C wäre ++ Programm, nicht die gestartete Shell ).

Sie könnten stattdessen die POSIX popen() Funktion verwenden; Sie würden die ‚2>&1‘ Notation in der Befehlsfolge enthalten müssen, dass Sie den Standardfehler des Befehls an den gleichen Ort zu schicken, wie die Standardausgabe geht, aber Sie würden keine temporäre Datei benötigen:

FILE *pp = popen("program arg1 arg2 2>&1", "r");

Sie können dann die Datei-Stream abgelesen. Ich bin nicht sicher, ob es eine saubere Art und Weise eine C Datei-Stream in eine C ++ istream abzubilden; es wahrscheinlich ist.

Andere Tipps

Sie müssen die STARTUP_INFO Struktur zu füllen, die hStdInput, hStdOutput und hStdError hat. Denken Sie daran, Griffe zu erben, wenn Sie Createprocess.

/* Assume you open a file handle or pipe called myoutput */
STARTUP_INFO si_startinfo;
ZeroMemory(&si_startinfo, sizeof(STARTUP_INFO));
si_startinfo.cb = sizeof(STARTUP_INFO);
si_startinfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si_startinfo.hStdOutput = myoutput;
si_startinfo.hStdError = myoutput;
si_startifno.dwFlags != STARTF_USEHANDLES;

PROCESS_INFORMATION pi_procinfo;
ZeroMemory(&pi_procinfo, sizeof(PROCESS_INFORMATION);

CreateProcess(NULL, cmdline, NULL, NULL, true, 0, NULL, pathname, &si_startinfo, &pi_procinfo);

Ich habe nicht die Fehlerbehandlung Aspekte dargestellt, die Sie tun müssen. Das fünfte Argument auf true gesetzt ist, die Griffe zu erben. Andere haben erklärt, wie Rohre zu schaffen, so will ich es hier nicht wiederholen.

Microsofts CRTs und die MSDN-Bibliothek tun, um die Systemfunktion und die _popen Funktion enthalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top