Gewusst wie: schließen von stdout und stderr in C?
Muss ich schließen, stdout und stderr für meine C-Programm. Wie ist es möglich, ohne das Programm zu beenden, in der Ausführung?
Warum wollen Sie, Sie zu schließen? Was hoffen Sie zu erreichen?
Was erwartest du, was passieren, wenn Sie Sie schließen?
Er kann wollen, um den Prozess im hintergrund. In diesem Fall sind Sie immer besser, schließen Sie alle standard-Datei-Deskriptoren, so dass Sie nicht am Ende mit Ihnen für ungültig erklärt.
Ich wollte nur direkt die stdout und stderr Ausgabe in eine log-Datei anstelle der Konsole. Tut mir Leid für die Beantwortung spät. Ich habe es jetzt funktioniert.
Was erwartest du, was passieren, wenn Sie Sie schließen?
Er kann wollen, um den Prozess im hintergrund. In diesem Fall sind Sie immer besser, schließen Sie alle standard-Datei-Deskriptoren, so dass Sie nicht am Ende mit Ihnen für ungültig erklärt.
Ich wollte nur direkt die stdout und stderr Ausgabe in eine log-Datei anstelle der Konsole. Tut mir Leid für die Beantwortung spät. Ich habe es jetzt funktioniert.
InformationsquelleAutor Undefined | 2011-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was haben Sie versucht? Nicht
fclose
Arbeit?es gibt keinen Weg, um es erneut zu öffnen.
Sie können öffnen Sie es mit freopen("/dev/tty","w",stdout); Dies wird Häufig verwendet, wenn ein Aufruf von execl ausfällt.
Ist in der Nähe einer der 3 Standard-streams gefährlich, mit potentiell persistent Auswirkungen für die eigentliche Maschine, die Sie lief die ausführbare Datei auf?
InformationsquelleAutor lhf
Können Sie einfach:
Für niemanden Wundern Sie sich, warum Sie dies möglicherweise tun möchten, ist dies eine Recht häufige Aufgabe für ein daemon/service-Prozess auf Unix.
Jedoch Sie sollten sich bewusst sein, dass das schließen einer Datei-Deskriptor kann unbeabsichtigte Folgen haben:
fopen
dass file-descriptor (auf Linux zumindest) ersetzen fd 1, also stdout. Jeder code, der später verwendet dieses schreiben in diese Datei, die nicht sein kann, was Sie soll.FILE*
Zeiger. Speziell:stdout
oderstderr
(dieFILE*
Zeiger (siehe Ihre definition), dann schreiben Sie diese währendFILE*
geschlossen ist Undefiniertes Verhalten. Dies wird wahrscheinlich zu einem Absturz Ihres Programms auf unerwartete Weise, nicht immer an der Stelle des Fehlers. Sehen Undefiniertes Verhalten.Den schnellen, one-line-Lösung ist
freopen()
Zu sagen/dev/null
,/dev/console
unter Linux/OSX odernul
auf Windows. Alternativ können Sie verwenden Sie Ihre Plattform-spezifische Umsetzung, um re-öffnen Sie die Datei-Deskriptoren/Griffe erforderlich.Diese zu schließen, ohne dass sich ein Ersatz (z.B.
/dev/null
) ist eine sehr schlechte Idee und in der Regel gefährlich.Sie haben den Grund falsch. Schreiben auf eine geschlossene
FILE
(stdio-stream) ist die UB, aber das schreiben auf eine geschlossene Datei-Deskriptor ist nurEBADF
. Auf jeden Fall der wichtigere Grund ist, dass ein weiterer Teil des Programms oder der Kind-Prozess eventuell zu einem späteren Zeitpunkt öffnen Sie eine wichtige Datei, die beauftragt wird die erste unbenutzte Datei-Deskriptor-Nummer. Wenn fd 0, 1 oder 2 ist unbenutzt, die neuen Datei-Deskriptor wird von stdin, stdout oder stderr, und könnte sich verändern, die von einem anderen Teil des Programms (oder ein Kind-Prozess) , verwendet diese für Ihre üblichen Zwecke...verwenden freopen("/dev/null", "r", stdin); , siehe man freopen()
ja, ich weiß. Ich Sprach das Problem in der Zeit, aber, um es deutlicher wird, habe ich neu geschrieben, die Antwort zu integrieren, und alle oben genannten Kommentare.
InformationsquelleAutor
Wenn Sie verhindern möchten, dass Ihre Bewerbung schriftlich an die Konsole, dann:
Ausgänge:
Hinweis: jeder Versuch, verwenden Sie einen FILE-Zeiger nachdem die Datei geschlossen wurde, ist falsch. Ich Tue es in diesem Fall einfach nur um zu illustrieren, was schließen Sie diese Datei-Deskriptoren könnte tun, um Ihre Anwendung.
FILE *
nachdem die Datei geschlossen wurde). Es könnte genauso gut Abstürzen oder schlechter.Der Teil des Codes, den Sie erwähnt haben, ist nur um zu veranschaulichen, was die Anwendung tut, da der Fragesteller nicht beantwortet unser get Kommentare über das, was er erwartet nach dem schließen von stdout/stderr. Da ich fügte hinzu, eine Warnung in der Antwort über diese, ich bin mir nicht sicher, ob ich noch verdienen die -1, aber trotzdem danke.
Ich entfernte die -1, aber "tun" ist immer noch falsch. Dies zu sagen ist, was es "machen könnte," würde besser sein, aber so oder so sollten Sie beachten, dass der Beispiel-code ist Undefiniertes Verhalten und ist ein Falsches Programm.
InformationsquelleAutor karlphillip
Warnung: ich bin nicht erfahren in C, aber kürzlich gelesen, dass eine Folie, die Antworten auf diese Frage direkt von Jim Meyering, ein RedHat-Mitarbeiter und GNUlib-Betreuer: https://www.gnu.org/ghm/2011/paris/slides/jim-meyering-goodbye-world.pdf. Ich habe lediglich zusammenfassen.
TL;DR
Bekommen closeout.c und Ihre Abhängigkeiten aus GNUlib in Ihre Quelle und rufen Sie
als erste Zeile in main.
Zusammenfassung
Zunächst einige heads-up-Warnung, die Angabe POSIX:
Schließen stream, ohne Umgang mit seinen Fehlern ist nicht stabil, und es ist das gleiche für stdout und stderr. Hier ist eine Liste der Fehler, die Sie behandeln müssen:
fclose(stdout)
ferror(stdout)
ein.k.ein. vorherigen Fehler__fpending(stdout)
ein.k.ein. Sachen, die nicht geleertUmgang mit diesen Fehlern, als GNUlib implementiert in close-stream.c, unten zitiert.
Hinweis:
__fpending
ist das Besondere an der glibc und kann nicht tragbar sein. OTOH, es ist auf die Art und Weise standardisiert werden alsfpending
.P. S.:
Dass ist nicht ein guter Grund, um in der Nähe von stdout und stderr wenn Sie schreiben einen daemon nach http://cloud9.hedgee.com./scribbles/daemon#logging. Sollten Sie eine daemon-manager (wie daemon tools, runit, s6, nosh, OpenRC und systemd) Griff die Umleitung.
Jedoch sollten Sie immer noch schließen Sie alle Strom, dass das Programm je geschrieben hat, um am Ende auf Fehler überprüfen. Zitat aus der Nähe-stream.c:
InformationsquelleAutor FRIdSUN