Entrada de terminal canónica versus no canónica

Resuelto titaniumdecoy asked hace 15 años • 1 respuestas

Estoy estudiando para un examen y no sé cómo funciona la entrada/salida canónica versus la no canónica en Unix (por ejemplo, curses). Entiendo que existe un margen al que se aplican las "disciplinas de línea" para la entrada canónica. ¿Significa esto que se omite el búfer para entradas no canónicas, o simplemente significa que no se aplican disciplinas de línea? ¿En qué se diferencia este proceso para las operaciones de entrada y salida?

En los programas 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 haya escrito una cierta cantidad de caracteres o haya pasado una cierta cantidad de tiempo. ¿Alguna de estas cosas se considera "disciplinas lineales" o es algo completamente distinto?

titaniumdecoy avatar Dec 11 '08 10:12 titaniumdecoy
Aceptado

Para información canónica, piense en shell; de hecho, piense en el antiguo shell Bourne, ya que Bash y sus parientes tienen edición de línea de comandos. Escribe una línea de entrada; Si comete un error, utilice el carácter de borrado (el valor predeterminado es Backspace, normalmente; a veces Delete) para borrar el carácter anterior. Si te equivocas por completo, puedes cancelar toda la línea con el carácter de eliminación de línea (no completamente estandarizado, a menudo Control-X). En algunos sistemas, se borra una palabra con Control-W. Todo esto es entrada canónica. Se recopila y edita toda la línea hasta que Returnse presiona el carácter de final de línea — —. Acto seguido, toda la línea queda disponible para los programas en espera. Dependiendo de las read()llamadas del sistema que estén pendientes, toda la línea estará disponible para ser leída (por una o más llamadas a read()).

Para entradas no canónicas (piense vio vimlo que sea), presiona un carácter y estará inmediatamente disponible para el programa. No te retrasarán hasta que presiones regresar. El sistema no edita los personajes; se ponen a disposición del programa tan pronto como se escriben. Depende del programa interpretar las cosas apropiadamente. Ahora, vimhace una serie de cosas que se parecen un poco a la entrada canónica. Por ejemplo, la tecla de retroceso retrocede y, en el modo de entrada, borra lo que había allí. Pero eso es porque vimelige que se comporte así.

La producción canónica y no canónica es un asunto mucho menos serio. Hay algunas diferencias, relacionadas con cosas como si hacer eco del retorno de carro antes del salto de línea y si hacer retrasos (no es necesario con la electrónica; importante en los días en que el dispositivo de salida podría haber sido un 110- teletipo en baudios). 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 muestran en mayúsculas y las letras mayúsculas como barra invertida y mayúsculas.

Solía ​​ser que si escribías todas las letras mayúsculas en el mensaje de inicio de sesión, entonces el programa de inicio de sesión se convertía automáticamente al modo en el que todas las mayúsculas aparecían con una barra invertida delante de cada mayúscula real. Sospecho que esto ya no se hace en terminales electrónicos.


En un comentario, TitaniumDecoy preguntó:

Entonces, con la entrada no canónica, ¿se omite por completo el búfer de entrada? Además, ¿dónde entran las disciplinas de línea?

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

Las disciplinas de línea son cosas como el conjunto de manipulaciones que realiza 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ónico. Si tiene icaseconfigurado (mapeo de mayúsculas y minúsculas), los caracteres en mayúsculas se asignan a minúsculas a menos que estén precedidos por una barra invertida; Esa 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 "poner a disposición de read()" el insumo acumulado; si no hay entrada acumulada (si escribe Control-Dal principio de una línea), devolverá read()cero bytes, lo que luego los programas interpretarán como EOF. Por supuesto, después de eso puedes escribir más caracteres en el teclado, y los programas que ignoran EOF (o se ejecutan en modo no canónico) estarán muy contentos.

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

De manera similar, las señales de interrupción y salida son artefactos del procesamiento en modo canónico. También lo son las señales de control del trabajo, como Control-Zsuspender el proceso actual y regresar al shell. Asimismo, el control de flujo ( Control-S, Control-Qpara detener e iniciar la salida) lo proporciona el modo canónico.

El capítulo 4 de Programación avanzada Unix de Rochkind , 2.ª edición, cubre la E/S del terminal y proporciona gran parte de esta información, y mucha más. Otros libros de programación UNIX (al menos los buenos) también lo cubrirán.

Jonathan Leffler avatar Dec 11 '2008 03:12 Jonathan Leffler