2010-11-24 7 views
13

In Stevens UNIX Network Programming erwähnt er Umleitung stdin, stdout und stderr, die beim Einrichten eines Daemon benötigt wird. Er tut es mit dem folgenden C-CodeUmleiten von STDIN, STDOUT, STDERR nach/dev/null in C

/* redirect stdin, stdout, and stderr to /dev/null */ 
open("/dev/null", O_RDONLY); 
open("/dev/null", O_RDWR); 
open("/dev/null", O_RDWR); 

Ich bin verwirrt, wie diese drei ‚wissen‘, sie sind Umleiten der drei std *. Zumal die letzten beiden Befehle gleich sind. Könnte mir jemand erklären oder in die richtige Richtung weisen?

+2

Tch. Es ist gefährlich, es so zu machen. Verwenden Sie immer 'dup2()'. –

+2

Es ist nicht gefährlich, wenn Ihr Prozess single-threaded ist und Sie bereits den alten stdin/out/err geschlossen haben. –

+0

Diese Antwort könnte helfen: http://stackoverflow.com/a/4973065/207753 – SlappyTheFish

Antwort

12

Vermutlich wurden die Dateideskriptoren 0, 1 und 2 bereits geschlossen, als dieser Code ausgeführt wurde, und es gibt keine anderen Threads, die neue Dateideskriptoren zuweisen könnten. Da in diesem Fall open erforderlich ist, um immer die niedrigste verfügbare Datei-Deskriptor-Nummer zuzuweisen, ergeben diese drei zu öffnenden Aufrufe die Datei-Deskriptoren 0, 1 und 2, sofern sie nicht fehlschlagen.

+0

Aus irgendeinem Grund wählte er 'O_RDWR' statt' O_WRONLY'? –

+0

Da die Reihenfolge der Dateideskriptoren stdin, stdout, stderr ist. Die Standardeingabe ist natürlich nur lesbar. – slezica

+0

Sicher können stdout und stderr 'O_WRONLY' geöffnet werden, aber ich glaube nicht, dass es wirklich wichtig ist ... –

3

Das liegt daran, dass die Dateideskriptoren 0, 1 und 2 Eingabe, Ausgabe und Fehler sind und open den ersten verfügbaren Dateideskriptor ergreift. Beachten Sie, dass dies nur funktioniert, wenn die Dateideskriptoren 0, 1 und 2 nicht bereits verwendet werden.

Und Sie sollten sich über die verwendeten Begriffe, stdin, stdout und stderr tatsächlich Griffe Datei (FILE*) statt Filedeskriptoren, obwohl es eine Korrelation zwischen diesen und den Filedeskriptoren vorsichtig sein.