os.read(0, 1) vs. sys.stdin.read(1) unter select.select()
Verfasst: Freitag 28. Oktober 2011, 14:21
Hallo,
ich bin auf folgendes Verhalten von 'select()' aufmerksam geworden und kann es mir nicht wirklich erklären. Zum Nachvollziehen hier ich ein Beispiel:
input_('o'):
- Descriptoren haben keinen Puffer.
- Sollte 'select()' auf den dahinterliegenden Dateipuffer prüfen, so müssten die restlichen Zeichen '[' und 'D' darin ja auch erkannt und somit ein 'ready' auslösen.
Ich bin ratlos...
mutetella
ich bin auf folgendes Verhalten von 'select()' aufmerksam geworden und kann es mir nicht wirklich erklären. Zum Nachvollziehen hier ich ein Beispiel:
Code: Alles auswählen
import os
import select
import sys
import termios
import tty
class Cbreak(object):
def __init__(self):
self.old_term_settings = termios.tcgetattr(0)
def __enter__(self):
tty.setcbreak(0, termios.TCSADRAIN)
return self
def __exit__(self, type_, value, traceback):
termios.tcsetattr(0, termios.TCSAFLUSH, self.old_term_settings)
def write_(self, string_):
sys.stdout.write(string_)
sys.stdout.flush()
def wait_for_ready(timeout, terminal):
terminal.write_('wait_for_ready(timeout={0}) >> '.format(timeout))
if timeout is None:
ready, _, _ = select.select([0], [], [])
else:
ready, _, _ = select.select([0], [], [], timeout)
terminal.write_('ready: {0} >> '.format(ready))
return ready
def input_(manner, timeout=None):
with Cbreak() as terminal:
while True:
terminal.write_('\n')
wait_for_ready(timeout, terminal)
if manner == 'o':
terminal.write_('input_: >> ')
ch = os.read(0, 1)
terminal.write_(repr(ch))
else:
terminal.write_('input_: >> ')
ch = sys.stdin.read(1)
terminal.write_(repr(ch))
if ch == 'q':
break
- 'select()' wartet, weil nichts zum Auslesen vorhanden ist
--> drücke <left> ('\x1b', '[', 'D') - 'select()' gibt 'sys.stdin' als bereit zum Auslesen zurück.
Das geschieht 3 x in Folge, für jedes der 3 Zeichen in der Sequenz. - 'select()' wartet wieder, weil nichts (mehr) zum Auslesen vorhanden ist
- ...
- 'select()' wartet, weil nichts zum Auslesen vorhanden ist
--> drücke <left> ('\x1b', '[', 'D') - 'select()' gibt 'sys.stdin' als bereit zum Auslesen zurück.
Das geschieht 1 x für '\x1b' - 'select()' wartet, obwohl sich '[' und 'D' noch in 'sys.stdin' befinden.
--> drücke a - 'select()' gibt 'sys.stdin' als bereit zum Auslesen zurück.
Das geschieht 3 x in Folge für '[', 'D' und das 'a' - 'select()' wartet wieder, weil nichts (mehr) zum Auslesen vorhanden ist
- ...
- Descriptoren haben keinen Puffer.
- Sollte 'select()' auf den dahinterliegenden Dateipuffer prüfen, so müssten die restlichen Zeichen '[' und 'D' darin ja auch erkannt und somit ein 'ready' auslösen.
Ich bin ratlos...
mutetella