C: zum umleiten von stderr aus dem System-Befehl auf stdout oder Datei?
Den shell-Befehl $ avrdude -c usbtiny
Ausgänge text zu stderr. Ich kann es nicht Lesen mit commmands wie Kopf-weniger-mehr cos es ist nicht die Ausgabe auf stdout. Ich möchte den text auf die Standardausgabe oder in eine Datei. Wie kann ich es in C? Ich habe versucht das problem zu lösen, indem meine Letzte Frage aber noch ungelöst.
InformationsquelleAutor otto | 2010-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe nicht versucht, so etwas in OpenBSD, aber zumindest einige *nix-artigen Systemen, Sie können dies tun, indem
dup2
.InformationsquelleAutor Dusty
Ist der normale Weg wäre so etwas wie:
Dies weist was würde gehen in der Regel stderr gehen auf stdout statt. Wenn Sie lieber direkt in eine Datei, die man tun könnte etwas wie:
auf welche Plattform? Die Norm gilt nicht für diese, so müssen Sie einige nicht-portablen code zu tun, es in C.
Ich muss ja irgendwie blockieren Sie den Befehl in C, so kann ich seine stderr
Jerry Sarg: mit OpenBSD
InformationsquelleAutor Jerry Coffin
Folgende verwendet die POSIX-Funktion zum duplizieren der standard-Ausgabe-Datei Anzahl in den standard-Fehler-Datei-Nummer. Duplizieren von stderr zu stdout wird in der POSIX-Seite für
dup2
als ein Beispiel für die Verwendung der Funktion.InformationsquelleAutor dreamlax
Starten Sie durch das Lesen
man fork
,man exec
wie man ein child-Prozess. Schauen Sie inman 7 signal
,man sigaction
undman wait
für wie zu ernten, das Kind.Schließlich die
man dup2
.Ungetesteten code zu veranschaulichen:
Verwendung von dup2() ersetzen wir stderr (was ist fd 2) für das Kind mit einem schreiben Ende des Rohres. pipe() wird aufgerufen, bevor fork(). Nach der Gabel, die wir auch haben, schließen Sie alle hängen enden des Rohres, so dass die Lesung in den übergeordneten Prozess auch tatsächlich erhalten EOF.
Wahrscheinlich gibt es eine einfachere Lösung mit stdio, aber ich bin mir nicht bewusst es. Seit popen() ausgeführt wird, den Befehl über die shell, wahrscheinlich kann man sagen, die Umleitung von stderr nach stdout (und schicken die Standardausgabe nach /dev/null). Nie versucht.
Kann man auch mit mktemp() (
man 3 mktemp
) zum erstellen einer temp-Datei-name, Komponieren Befehl für system() umleiten von stderr des Befehls, um die temp-Datei und nach dem system() gibt an, Lesen Sie die temp-Datei.InformationsquelleAutor Dummy00001