select() und EOF bei stdin

25/11/2013 - 14:55 von Anonym | Report spam
Soweit ich das sehe, kriege ich bei einem Socket, wenn es von der
Gegenseite geschlossen wird, von "select" noch ein "Read Flag"
zurückgegeben (also passend zur select-Semantik: Die Anzeige, daß ich
read() aufrufen kann ohne zu warten) und kriege dann als Anzahl der
gelesenen Zeichen 0.

Wenn ich auf der Konsole stdin eingebe, liest bei mir read 1 Zeichen und
zwar 0x04, also "End of Transmission".

Ist das so gewollt?
 

Lesen sie die antworten

#1 Friedhelm Waitzmann
27/11/2013 - 06:30 | Warnen spam
Anonym:
Soweit ich das sehe, kriege ich bei einem Socket, wenn es von der
Gegenseite geschlossen wird, von "select" noch ein "Read Flag"
zurückgegeben (also passend zur select-Semantik: Die Anzeige, daß ich
read() aufrufen kann ohne zu warten) und kriege dann als Anzahl der
gelesenen Zeichen 0.

Wenn ich auf der Konsole stdin eingebe, liest bei mir read 1 Zeichen und
zwar 0x04, also "End of Transmission".

Ist das so gewollt?



Was gewollt ist, làsst sich einstellen, siehe die Handbuchseite
stty(1).

Wenn man auf der Konsole „End of Transmission“ signalisieren
will, indem man Control‐D eingibt, muss die Konsole entsprechend
eingestellt werden (Das ist der Normalfall. Wenn es nicht so
ist, dann hat es ein Prozess verstellt):

stty icanon eof '^D'

stty icanon:
Stelle canonical Input‐Processing ein.

stty eof '^D':
Im Falle von canonical Input‐Processing werden, wenn Control‐D
eingegeben wird, alle Zeichen, die darauf warten, gelesen zu
werden, sofort an den lesenden Prozess weitergereicht, ohne dass
die Eingabe mit einem Zeilenendezeichen abgeschlossen werden
müsste. Das Zeichen Control‐D selbst wird nicht an den lesenden
Prozess weitergereicht sondern einfach weggeworfen.

Gibt man also schon am Anfang einer Zeile dieses EOF‐Zeichen ein,
so ist die Anzahl der Zeichen, die read() liefert, 0.

Wenn ich auf der Konsole stdin eingebe, liest bei mir read 1 Zeichen und
zwar 0x04, also "End of Transmission".



Das làsst vermuten, dass nicht einmal canonical Input‐Processing
eingestellt ist, weil read() ein Zeichen ohne ein
Zeilenendezeichen liefert.

Wenn du das Device weißt, z.B. /dev/pts/21, dann lass dir doch
mal – von einem anderen Terminal aus – die Einstellungen anzeigen
mit
stty -a </dev/pts/21

Um beispielsweise nach Absturz eines Editorprogramms wieder
Ordnung zu schaffen, kann auch

stty sane

helfen. Das stellt dann das Terminal so ein, dass man bequem
weitere stty‐Aufrufe tàtigen kann. Möglicherweise macht das der
Kommandointerpreter bash auch schon selbst, wenn ein
Foreground‐Process‐Group endet und das Terminal nicht auf
canonical Input‐Processing eingestellt ist.

Friedhelm
Bitte in die Adressierung auch meinen |Please put my full name also into
Vor- u. Nachnamen stellen z.B. |the recipient like
Friedhelm Waitzmann , (Friedhelm Waitzmann) ,
"Waitzmann, Friedhelm"

Ähnliche fragen