Unvollendetes read(STDIN_FILENO)

02/11/2008 - 22:16 von Udo Steinbach | Report spam
Helau

Ich mache
read(STDIN_FILENO, Buffer, 64);
bei
termios::c_cc[VMIN] = 1
und warte so auf eine Taste. Ab und zu wird auf meinem Debian dieses
read() mit Rückgabe 1 fertig gestellt, obwohl weitere Bytes anliegen,
z.B. Escape-Sequenz Page Down oder Umlaute in UTF-8. Ich hielt diese
Unterbrechung bisher für Theorie, denn fürs Schreiben eines solchen
Strings dürfte das System keine nennenswerte Zeit beanspruchen. Dieses
Problem gibt es auf der nackten Text-Konsole, anscheinend nicht in X.

Wie kann man diesen Abbruch verhindern oder feststellen?
Ein Timeout, durch zusàtzliche read(), select() oder Pausen, dürfte das
Problem zwar vermindern, aber nicht vermeiden, denn es kommt auch bei
einzelnen Tastendrücken vor, wenn read() also tatsàchlich warten mußte.
Bei weiteren nicht wartenden read() müßte ich demnach ja damit rechnen,
daß die Taste dann immer noch nicht komplett ist, denk ich mal.
Letztendlich kann ich diese Leserei ja nicht beliebig ausdehnen. Wàre
wenigstens der Abbruch feststellbar, müßte ich ja nur solange lesen, bis
er nicht mehr auftritt. Besser wàre Vermeidung des Abbruches.
Die fahrradfreundliche Stadt Oldenburg: http://radwege.udoline.de/
PGP: A245 F153 0636 6E34 E2F3 E1EB 817A B14D 3E7E 482E
 

Lesen sie die antworten

#1 Heike C. Zimmerer
03/11/2008 - 10:37 | Warnen spam
Udo Steinbach writes:

Helau

Ich mache
read(STDIN_FILENO, Buffer, 64);
bei
termios::c_cc[VMIN] = 1
und warte so auf eine Taste. Ab und zu wird auf meinem Debian dieses
read() mit Rückgabe 1 fertig gestellt, obwohl weitere Bytes anliegen,
z.B. Escape-Sequenz Page Down oder Umlaute in UTF-8. Ich hielt diese
Unterbrechung bisher für Theorie, denn fürs Schreiben eines solchen
Strings dürfte das System keine nennenswerte Zeit beanspruchen. Dieses
Problem gibt es auf der nackten Text-Konsole, anscheinend nicht in X.



Du musst mit Timeout lesen, bis nichts mehr kommt. Es ist schon lange
her, dass ich viel mit Terminals zu tun hatte, aber c_cc[VMIN]=<maximale
Lànge einer Escape-Sequenz>, c_cc[VTIME]=1 (100ms) dürfte das Gewünschte
tun. Der read() muss natürlich >= VMIN Zeichen anfordern.

Ähnliche fragen