2016-07-26 12 views
-1

Ich entwickle ein Werkzeug für die Verarbeitung von Coredump. Unter Verwendung sysctl ich es einstellen, um Coredump auf Werkzeugeingabe zu erhalten. Alles funktioniert super. Aber heute habe ich mich mit der Situation konfrontiert, als (ich weiß nicht, warum) coredump ist gebrochen. Wenn ich reguläre Datei als coredumps Ziel einstelle - es erscheint nicht. Also - ich vermute, dass es aus irgendeinem Grund kaputt ist. Wenn ich stattdessen mein Tool tee einrichten - kein Ergebnis.Wie zu bestimmen, dass die Eingabe (Stdin) unterbrochen ist?

So. Ich möchte eine solche Situation feststellen (wenn es möglich ist) und sie protokollieren, anstatt fehlerhafte Dateien zu erstellen.

Ich verwende ::read(STDIN_FILENO,buff, buffSize), um Daten zu erhalten. Und am Ende read geben Sie einfach 0 zurück. Ich möchte angeben, wenn 0 bedeutet das Ende der Datei und wenn es heißt, Rohr ist gebrochen.

+0

Haben Sie das Ergebnis des 'read'-Anrufs überprüft? –

+0

Ja, und ich habe darüber in meiner ersten Nachricht geschrieben. Ergebnis ist Null. – denys

+0

"Am Ende ist es einfach Returns" 0 "" klang wie du beschwert hast, dass Buff am Ende Nullen hatte. Bitte produziere nächstes Mal ein [MCVE]. Richtig, also, was ist das Problem? Wenn Sie "0" bekommen, ist die Pfeife kaputt. Was fehlt? –

Antwort

1

Je nach Fehlern im Programm, etwas schief gehen könnte und es gibt keine zuverlässige Möglichkeit, zu erkennen, was schief gegangen ist oder sogar wenn etwas schief gegangen ist.

Sobald ein Programm nicht definiertes Verhalten oder ähnliche Übungen, alle Wetten ab, und das Beste, was Sie tun können, ist Hoffnung, dass einige Berichtsweg noch zuverlässig arbeitet. Im Allgemeinen können Sie einem vom Betriebssystemkern geschriebenen Core/Mini-Dump vertrauen, um den Status des Programms zum Zeitpunkt des Absturzes zuverlässig zu erfassen. Aber wenn Ihr Programm den Stack korrumpiert oder andere schreckliche Dinge getan hat, können die Stack-Spuren, die Sie von diesen Dumps erhalten, immer noch nahe an unbrauchbar sein.

+0

Ich interessiere mich nicht für den Inhalt des Arbeitskerns. Ich will nur Benutzer informieren, dass Coredump wegen etw abgebrochen wurde. Ohne mein Werkzeug fehlt so ein Arbeitskolben. Weil Datei nicht beendet ist. Aber mein Werkzeug beendet die Datei nur, wenn keine Eingaben mehr empfangen werden. Damit. Hauptquest - Kann man feststellen, dass der Input gebrochen ist? – denys

+0

"Kann festgestellt werden, dass die Eingabe unterbrochen wurde?" - In vielen Fällen vielleicht, wahrscheinlich. Im allgemeinsten Fall. Nein. –

0

Sie haben bereits herausgefunden: read gibt 0 zurück, was bedeutet, dass keine Bytes gelesen wurden. Zum Blockieren von Streams wie STDIN, die warten sollen, bis die Bytes gelesen werden können, ist das ein Fehlerzustand.

Sie brauchen keine "andere API"; Sie müssen lediglich die Dokumentation für die von Ihnen verwendete Dokumentation lesen.