Compruebe los caracteres adicionales en el búfer de terminal de Linux

Intento implementargetch() función en Python, que también debería devolver la lista de caracteres para teclas especiales como F1-F12 y teclas de flecha. Estas teclas especiales generan varios caracteres en una secuencia. Por lo tantogetch() lee un carácter en modo de bloqueo y luego debe verificar si hay caracteres adicionales en el búfer de entrada para recuperarlos también.

Estoy usandoioctl llame junto con termios.FIONREAD para obtener el número de bytes en el búfer de entrada. Captura pulsaciones de teclas no especiales apiladas en el búfer, pero pierde símbolos adicionales de teclas especiales. Parece que hay dos buffers diferentes y sería bueno si alguien pudiera explicar esto.

Aquí está el ejemplo interactivo:

from time import sleep

def getch():
    import sys, tty, termios
    fd = sys.stdin.fileno()
    # save old terminal settings, because we are changing them
    old_settings = termios.tcgetattr(fd)
    try:
        # set terminal to "raw" mode, in which driver returns
        # one char at a time instead of one line at a time
        #
        # tty.setraw() is just a helper for tcsetattr() call, see
        # http://hg.python.org/cpython/file/c6880edaf6f3/Lib/tty.py
        tty.setraw(fd)
        ch = sys.stdin.read(1)

        # --- check if there are more characters in buffer
        from fcntl import ioctl
        from array import array

        sleep(1)
        buf = array('i', [0])
        ioctl(fd, termios.FIONREAD, buf)
        print "buf queue: %s," % buf[0],
        # ---

    finally:
        # restore terminal settings. Do this when all output is
        # finished - TCSADRAIN flag
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch

char = ''
while char != 'q':
  char = getch()
  print 'sym: %s, ord(%s)' % (char, ord(char))

Notasleep(1) en el medio. Si presiona una tecla antes de que expire este segundo, la salida será:

buf queue: 0, sym: l, ord(108)

Para 5 teclas ordinarias (por ejemplo, 'asdfg') ingresadas en un segundo, la salida es:

buf queue: 4, sym: a, ord(97)

pero para una sola tecla de flecha, la salida:

buf queue: 0, sym: , ord(27)
buf queue: 0, sym: [, ord(91)
buf queue: 0, sym: D, ord(68)

Hay dos preguntas aquí

¿Por qué se descartan 4 símbolos en cola con las pulsaciones de teclas normales? ¿Se debe al cambio al modo de terminal "sin procesar"? ¿Cómo es posible conservar los caracteres para la posteriorgetch() se ejecuta sin dejar el terminal en modo "sin procesar"

Porqué elioctl@ buffer para una sola pulsación de tecla especial está vacío? ¿De dónde vienen esos personajes para la posteriorgetch() ¿carreras? ¿Cómo verificarlos?

Respuestas a la pregunta(2)

Su respuesta a la pregunta