Entrada terminal canónica vs. no canónica

Estoy estudiando para un examen y estoy confundido sobre cómo funciona la entrada / salida canónica frente a la no-canónica en Unix (por ejemplo, maldiciones). Entiendo que hay un búfer al que se aplican “disciplinas de línea” para la entrada canónica. ¿Significa esto que el buffer se pasa por alto para la entrada no canónica, o simplemente significa que no se aplican disciplinas de línea? ¿Cómo difiere este proceso para las operaciones de entrada y salida?

En los progtwigs de curses con los que he trabajado que demuestran la entrada canónica, la entrada escrita por un usuario se ingresa automáticamente después de que se ha escrito una cierta cantidad de caracteres o ha pasado una cierta cantidad de tiempo. ¿Alguna de estas cosas se considera “disciplinas de línea” o es algo completamente diferente?

Para la entrada canónica, piense en shell; de hecho, piensa en la buena anticuada carcasa de Bourne, ya que Bash y sus parientes tienen una edición de línea de comandos. Escribe una línea de entrada; si comete un error, use el carácter de borrar (el valor predeterminado es Retroceso , por lo general, a veces Eliminar ) para borrar el carácter anterior. Si se equivoca completamente, puede cancelar toda la línea con el carácter de final de línea (no completamente estandarizado, a menudo Control-X ). En algunos sistemas, obtienes una palabra que se borra con Control-W . Todo esto es una entrada canónica. Toda la línea se recostack y edita hasta que se presiona el carácter de fin de línea – Retorno -. A continuación, toda la línea se pone a disposición de los progtwigs en espera. Dependiendo de las llamadas al sistema de read() que estén pendientes, toda la línea estará disponible para ser leída (por una o más llamadas para read() ).

Para la entrada no canónica – piense en vi o vim o lo que sea – presiona un carácter, y está inmediatamente disponible para el progtwig. No te retienen hasta que tocas el retorno. El sistema no edita los personajes; están disponibles para el progtwig tan pronto como se escriben. Depende del progtwig interpretar las cosas de manera apropiada. Ahora, vim sí hace una serie de cosas que se parecen un poco a la entrada canónica. Por ejemplo, el retroceso se mueve hacia atrás y en el modo de entrada borra lo que estaba allí. Pero eso es porque vim elige hacer que se comporte así.

La producción canónica y no canónica es un negocio mucho menos serio. Hay algunas diferencias, relacionadas con cosas como si se debe repetir el retorno de carro antes de la alimentación de línea, y si se deben hacer retrasos (no es necesario con la electrónica; es importante en los días en que el dispositivo de salida podría haber sido un 110- teletipo baud). También puede hacer cosas como manejar dispositivos de salida que no distinguen entre mayúsculas y minúsculas: teletipos, nuevamente. Las letras minúsculas se imprimen en mayúsculas y las letras mayúsculas como barras invertidas y mayúsculas.

Solía ​​ser que si escribía todas las letras mayúsculas en el prompt de inicio de sesión, entonces el progtwig de inicio de sesión se convertiría automáticamente al modo donde todos los topes se imprimían con una barra diagonal inversa delante de cada capital real. Sospecho que esto ya no se hace en los terminales electrónicos.


En un comentario, TitaniumDecoy preguntó:

Entonces, con una entrada no canónica, ¿el bypass de entrada está completamente anulado? Además, ¿dónde entran las disciplinas de línea?

Con entrada no canónica, el búfer de entrada todavía se usa; si no hay ningún progtwig con una llamada de read() esperando la entrada del terminal, los caracteres se mantienen en el búfer de entrada. Lo que no sucede es cualquier edición del buffer de entrada.

Las disciplinas de línea son cosas como el conjunto de manipulaciones que hace la edición de entrada. Entonces, un aspecto de la disciplina de línea es que el carácter de borrado borra un carácter anterior en el modo de entrada canónica. Si tiene icase (mapeo de casos de entrada) establecido, los caracteres en mayúsculas se asignan a minúsculas a menos que estén precedidos por una barra invertida; eso es una disciplina de línea, creo, o un aspecto de una disciplina de línea.


Olvidé mencionar que el procesamiento EOF ( Control-D ) se maneja en modo canónico; en realidad significa ‘hacer que la entrada acumulada esté disponible para read() ‘; si no hay una entrada acumulada (si escribe Control-D al comienzo de una línea), entonces read() devolverá cero bytes, que luego los progtwigs interpretarán como EOF. Por supuesto, puede escribir alegremente más caracteres en el teclado después de eso, y los progtwigs que ignoran EOF (o se ejecutan en modo no canónico) serán bastante felices.

Por supuesto, en modo canónico, los caracteres escritos en el teclado normalmente se repiten en la pantalla; puedes controlar si ese eco ocurre. Sin embargo, esto es algo tangencial a la entrada canónica; la edición normal ocurre incluso cuando el eco está desactivado.

Del mismo modo, las señales de interrupción y de abandono son artefactos del procesamiento de modo canónico. También lo son las señales de control de trabajo como Control-Z para suspender el proceso actual y regresar al shell. Del mismo modo, el control de flujo ( Control-S , Control-Q para detener e iniciar la salida) es proporcionado por el modo canónico.

El Capítulo 4 de la Progtwigción Unix Avanzada de Rochkind , 2nd Edn cubre la E / S del terminal y brinda mucha de esta información, y mucho más. Otros libros de progtwigción de UNIX (al menos, los buenos) también lo cubrirán.