Über stdout / stderr Umleitungen

8

Ich habe einen Code geschrieben, um absichtlich einen Laufzeitfehler zu erhalten:

%Vor%

Es gibt:

%Vor%

Um nun die Laufzeitfehler aufzuzeichnen, mache ich:

%Vor%

Aber beide Dateien sind leer. Warum?

BEARBEITEN:

Ich schreibe gerade ein Skript für die Fernkompilierung und Ausführung eines c-Programms. Aus den Antworten bekomme ich, dass Segmentation Fault nicht die Fehlerausgabe des Programms ist. Gibt es eine Möglichkeit, diese Ausgabe zu erfassen? Außerdem ist das Programm nur ein Beispiel, daher kann ich die Anweisungen nicht hinzufügen. Kann die Zeilenpufferung auf andere Weise mit Umleitungen erfolgen?

    
lalli 29.10.2010, 08:36
quelle

3 Antworten

10

so.txt ist leer, da stdout vor dem Absturz nicht geleert wurde, so dass der gepufferte Inhalt verloren ging. Wenn Sie hinzufügen: fflush (stdout); zwischen den printf-Befehlen enthält es den erwarteten Text.

Ihre soe.txt fehlt auch die Meldung "Segmentation Fault", weil sie von der Shell, nicht von Ihrem Programm gedruckt wurde und daher nicht Teil der Programmausgabe war, die umgeleitet werden sollte.

Wenn Sie den Code nicht ändern können, können Sie die Zeilenpufferung aktivieren, indem Sie das Programm täuschen, um zu denken, dass es auf ein tty gedruckt wird. Erstellen Sie das Skript error.sh:

%Vor%

Dann mach chmod a + x error.sh und rufe es so unter Linux auf:

%Vor%

Oder so auf OS X:

%Vor%

Die genaue Ausgabe ist etwas systemabhängig, wird aber wahrscheinlich sowohl "Hello World" als auch "Segmentation Fault" enthalten.

Überlegen Sie auch, ob Sie geeignete # include-Zeilen hinzufügen und einen Wert von main zurückgeben.

    
jjrv 29.10.2010, 08:43
quelle
7

Weil ein Segmentierungsfehler ernst ist. Puffer werden nicht gespült, Ihr Prozess wird nur heftig heruntergefahren.

Der Grund, warum Sie den Text bei der Ausführung ohne Umleitung sehen, ist, dass die Standardausgabe liniengepuffert ist (ISO C schreibt vor, dass die vollständige Pufferung nur verwendet wird, wenn festgestellt werden kann, dass das Gerät nicht interaktiv ist). Mit anderen Worten, es wird geleert, wenn es eine neue Zeile sieht, und das passiert vor Ihrer ungültigen Aufhebung der Referenzierung.

Da die Dateiausgabe jedoch nicht liniengepuffert ist, warten die Informationen immer noch darauf, gesendet zu werden, wenn das Universum Ihres Programms herausgezogen wird.

Obwohl die Unterstützung dafür implementationsdefiniert ist, können Sie ein bestimmtes Datei-Handle für die Zeilenpufferung einrichten, indem Sie setvbuf mit dem _IOLBF -Modus verwenden, etwa wie folgt:

%Vor%

am Anfang von main() - es spart eine erhebliche Menge an Eingabe über fflush für jede Ausgabezeile.

    
paxdiablo 29.10.2010 08:43
quelle
3

Ich denke, das sollte es tun:

%Vor%     
fortran 29.10.2010 08:56
quelle

Tags und Links