Diese Art der Eingabeverarbeitung wird nur von zeichenorientierten Terminals, nicht aber von Blockterminals unterstützt.
Bei der besonderen Eingabeverarbeitung werden die Eingabezeichen nicht zu Zeilen zusammengefasst und eine Verarbeitung von ERASE
- und KILL
-Zeichen findet nicht statt. Die Werte der Elemente MIN
und TIME
des Vektors c_cc
werden verwendet, um zu entscheiden, wie der Prozess die Zeichen erhalten soll. Das O_NONBLOCK
-Bit (siehe auch open()
oder fcntl()
) hat Vorrang vor den Festlegungen im Vektor c_cc
. Wenn daher O_NONBLOCK
gesetzt ist, kehrt read()
sofort zurück, unabhängig von den MIN
- und TIME
-Werten. Außerdem kann read()
, wenn keine Daten vorhanden sind, entweder 0 oder -1 zurückgeben und in letzterem Fall errno
gleich EAGAIN
setzen.
MIN
gibt die Mindestanzahl an Zeichen (maximal 255) an, die bei einer erfolgreich ausgeführten Funktion read()
empfangen werden sollten (d.h. die dann dem Benutzer zurückgeliefert werden). TIME
ist ein Timer (eine Zeitüberwachung) auf Zehntelsekunden-Basis für schubweise und geringe Datenübertragungen. Wenn MIN
größer als {MAX_INPUT}
ist, dann ist nicht festgelegt, wie die Anforderung behandelt wird. Die folgenden Absätze beschreiben die vier möglichen Kombinationen von MIN
und TIME
sowie ihre Wechselwirkung:
1. Fall: MIN > 0, TIME > 0
In diesem Fall dient TIME
als zeichenorientierter Timer und wird nach dem ersten empfangenen Zeichen aktiviert. Bei jedem neuen Zeichen wird TIME
zurückgesetzt; sobald ein Zeichen empfangen wird, wird TIME
gestartet. Werden MIN
Zeichen empfangen, bevor der Timer TIME
abgelaufen ist, so wird der Leseauftrag erfüllt. Läuft der Timer TIME
ab, bevor MIN
Zeichen empfangen wurden, so werden die bis zu diesem Zeitpunkt empfangenen Zeichen an den Benutzer übergeben. Es wird immer mindestens ein Zeichen zurückgeliefert, wenn TIME
abläuft, da der Timer erst nach dem Empfang des ersten Zeichens aktiviert wird. In diesem Fall blockiert die Leseoperation solange, bis entweder der MIN
- und TIME
-Mechanismus durch den Empfang des ersten Bytes aktiviert wird oder ein Signal eintrifft.
2. Fall: MIN > 0, TIME = 0
Da TIME
den Wert 0 hat, ist die Zeitüberwachung wirkungslos und nur MIN
ist signifikant. In diesem Fall blockiert die Leseoperation solange, bis MIN
Zeichen empfangen wurden oder bis ein Signal eintrifft. Ein Programm, das diesen Fall nutzt, um Datensätze von einem Terminal zu lesen, kann bei einer Leseoperation beliebig lange blockieren (d.h. auch unendlich lange).
3. Fall: MIN = 0, TIME > 0
Da MIN
gleich 0 ist, dient TIME
nicht mehr als zeichenorientierter Timer, sondern als Zeitüberwachung für die gesamte Leseoperation, die bei der Bearbeitung des read()
-Aufrufs aktiviert wird (Standardbehandlung). In diesem Fall wird eine Leseoperation ausgeführt, sobald entweder ein Zeichen empfangen wird oder der Timer TIME
abläuft. Wenn innerhalb des Zeitraums von TIME
* 0,1 Sekunden nach dem Aufruf von read()
kein Byte empfangen wird, dann liefert die Funktion read()
das Ergebnis 0 und hat keine Daten gelesen.
4. Fall: MIN = 0, TIME = 0
In diesem Fall wird sofort die geforderte Anzahl von zu lesenden Zeichen zurückgeliefert oder, wenn nicht so viele verfügbar sind, die Anzahl der aktuell verfügbaren Zeichen. Es wird nicht auf eine weitere Eingabe gewartet. Sind keine Eingabezeichen verfügbar, dann liefert die Funktion read()
den Wert 0 als Ergebnis und hat keine Daten gelesen.