-Konsole%20f%C3%BCr%20Standarddateideskriptoren.png)
Ich lese eine Shell-Programmimplementierung in C (die xv6-Shell aus dem Kurs 6.828 Operating System Engineering des MIT).
Die main()
Funktion für diese Shell beginnt mit dem folgenden Code:
//Assumes three file descriptors open
while((fd = open("console", O_RDWR)) >= 0){
if(fd >= 3){
close(fd)
break;
}
}
Dies ist ein Zitat aus dem xv6-Buch, das den obigen Code erklärt:
„Die Shell stellt sicher, dass sie immer drei Dateideskriptoren geöffnet hat, die die Standarddateideskriptoren für die Konsole sind.“
Ich verstehe, dass open()
ein Datei-Deskriptor mit der niedrigsten verfügbaren Nummer zurückgegeben wird. Somit stellt dieser Code sicher, dass nicht mehr als drei Datei-Deskriptoren geöffnet sind, was nach dem Lesen der Erklärung des Autors ziemlich offensichtlich ist.
Aber der Teil, den ich nicht verstehe, ist:
Warum will die Shell alle Dateideskriptoren außer 0, 1 und 2 schließen? Schließlich ist es doch garantiert, dass 0, 1 und 2 mit der Konsole verknüpft werden, oder? Warum sollte sich die Shell darum kümmern, dass Dateideskriptoren mit einer größeren Anzahl geschlossen werden?
Ich glaube, ich verstehe den Zweck der Konsolendatei ( /dev/console ? ) hier nicht wirklich.
Antwort1
Dieser Codeausschnitt öffnet /dev/console
. Der resultierende Dateideskriptor ist der Dateideskriptor mit der niedrigsten Nummer, der noch nicht geöffnet ist. Wenn diese Nummer höchstens 2 ist, wird die Schleife erneut ausgeführt. Wenn diese Nummer 3 oder höher ist, wird der Deskriptor geschlossen und die Schleife wird beendet.
Wenn die Schleife beendet ist, werden die Dateideskriptoren 0 bis 2 (stdin, stdout und stderr) sind garantiert geöffnet. Entweder waren sie schon vorher geöffnet und können mit einer beliebigen Datei verbunden sein, oder sie wurden gerade geöffnet und sind mit verbunden /dev/console
.
Die Wahl von /dev/console
ist seltsam. Ich hätte erwartet /dev/tty
, dass immer das steuernde Terminal ist, das mit der Prozessgruppe des aufrufenden Prozesses verknüpft ist. Dies ist eine der wenigen Dateien, dieder POSIX-Standard erfordert. /dev/console
ist derSystemkonsole, wohin die an die Konsole gesendeten Syslog-Meldungen gehen; es ist für eine Shell nicht sinnvoll, sich darum zu kümmern.
Antwort2
Das ist interessant für die Schleife. „open()“ gibt die Dateideskriptoren mit der niedrigsten Nummer zurück. Beispielsweise ist der aktuelle Dateideskriptor 10, was bedeutet, dass 0, 1 … und 9 zuvor geöffnet waren. Es schließt einen einzelnen zusätzlichen Dateideskriptor für die Konsole, den es gerade geöffnet hat.