Datei-Deskriptor 0
Zeichnung von dieser thread diskutieren Datei-Deskriptoren und Tabellen;
Ich möchte wissen, wie die Standardeingabe (Dateideskriptor 0, nicht in C stdin-DATEI-Struktur) erfolgt innerhalb der Geschosse.
Wenn ich ein Stück code wie read(0, buffer, 1024)
in C, die standardmäßig in C-Datei-Deskriptor 0 ist angeschlossen, die Tastatur, die shell ermöglicht es mir, geben Sie text ein, weil wir davon ausgehen, Lesen, warten, Lesen Sie den Inhalt des character device "standard input", auch bekannt als die Tastatur. Aber würde nicht die standard-Eingabe einfach leer und produzieren, als dessen Resultat? Okay, also lasst uns sagen, dass "mit Tastatur" Weg ist die Art und Weise zu erklären; wenn das der Fall ist, dann, dass muss bedeuten, Muscheln line buffer Ihrem Kommando, richtig? Aufrufen einer Lesen Sie auf Datei-Deskriptor 0 würde bedeuten, dass file-Deskriptor 0 in einer Schale verbunden ist, um das line-buffered-Puffer Ausgabe von standard-input, und nicht direkt auf der Tastatur, so dass das, was C warten? Außerdem, warum können wir nicht verwenden lseek()
auf standard ein - und hat gesagt 'Datei immer überschrieben wird jeder "schreiben", die es gibt und daher auch nichts zu suchen um als standard-Eingabe (der Tastatur) ist nicht wirklich eine Datei auf einem Speichermedium per se?
stdin
, das ist ein Strom von bytes. Es verwendet blockierende I/O zum Lesen, was bedeutet, dass, wenn es keine Charaktere auf stdin
zu Lesen, dann wartet einfach nur bis es gibt.Als "leer" und "Wartezeiten" sind nicht gegenseitig exklusiv. Was zählt, ist, ob ein Datei-Deskriptor ist open.
InformationsquelleAutor rjs | 2014-06-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
ist ein system-call, call-in-kernel-code. Die kernel-Implementierung von
read
verschicken an das terminal (oder pseudo-terminal) device-Treiber, die werden warten, bis Sie haben entweder eingegeben 1024 Zeichen ein Zeilenumbruch, oder ein EOF-marker, Strg+D.Die Pufferung erfolgt in der terminal-Treiber, wenn das terminal in den richtigen Modus. Ansonsten, das Programm wird einfach warten, bis 1024 bytes eingegeben werden.
Können Sie, wenn stdin ist eine reguläre Datei. Sie können nicht nur suchen, am terminal, weil das verlangen würde, dass die terminal-Treiber zu erinnern alle Daten, verabschiedet durch das terminal-Gerät, da es erstellt wurde.
Auch
stdin
unterscheidet sich von "fd 0". Es ist möglich, dass C sagt, dass Sie nicht versuchen, instdin
(zumindest ist es UB zu Spülen), aber das ist unabhängig von der Posix-API.Ich bin mit den OP ' s definition: "file-Deskriptor 0, nicht in C stdin-DATEI-Struktur". Es ist durchaus idiomatisch nennen fd0 "stdin". Ist es etwas, was konkret falsch in meiner Antwort, dass Sie denken, ich sollte fix?
Sie können es nennen
STDIN_FILENO
🙂 ich würde nur versuchen, klar zu sein über die Unterscheidung zwischen der Posix-API und der C-standard-Bibliothek. Alle haben Ihre eigenen Satz von Einschränkungen und Regeln. Ich bin mir nicht 100% sicher über die C-Bibliothek im moment, aber ich denke, die OP fragt über Posix.Right-O: ich habe vergessen, dass fd0-2 sind, in der Regel, verbunden mit /dev/tty. Aber wenn ich Anruf, die gleiche read-Funktion bekomme ich so etwas wie "line buffered" input: ist das, was heißt "Kanonische " input"? - gnu.org/software/libc/manual/html_node/...
InformationsquelleAutor Fred Foo