Articulo de referencia

Interfaz de terminal POSIX

La interfaz de terminal POSIX es la abstracción generalizada que comprende tanto una interfaz de programación de aplicaciones para programas como un conjunto de expectativas de ...

La interfaz de terminal POSIX es la abstracción generalizada que comprende tanto una interfaz de programación de aplicaciones para programas como un conjunto de expectativas de comportamiento para los usuarios de una terminal , tal como lo definen el estándar POSIX y la Especificación Única de Unix . Es un desarrollo histórico a partir de las interfaces de terminal de BSD versión 4 y la Séptima Edición de Unix .

Conceptos generales subyacentes

Hardware

En los sistemas Unix, se considera que múltiples dispositivos de E/S son "terminales". [ 1 ] [ 2 ] Estos incluyen:

Inteligencia y capacidades terminales

Inteligencia: los terminales son tontos, no inteligentes.

A diferencia de sus contemporáneos mainframe, pero como otros sistemas operativos de minicomputadoras , el sistema Unix original se desarrolló exclusivamente para terminales tontas , y ese sigue siendo el caso hoy en día. [ 6 ] Una terminal es un dispositivo orientado a caracteres, que comprende flujos de caracteres recibidos desde y enviados al dispositivo. [ 6 ] [ 7 ] Aunque los flujos de caracteres están estructurados, incorporando caracteres de control , códigos de escape y caracteres especiales, el protocolo de E/S no está estructurado como lo estaría el protocolo de E/S de terminales inteligentes . No hay especificaciones de formato de campo. No hay transmisión de bloques de pantallas completas (formularios de entrada) de datos de entrada.

Por el contrario, los ordenadores centrales suelen utilizar terminales orientados a bloques .

Capacidades: terminfo, termcap, curses, et al.

Las "capacidades" de un terminal comprenden diversas funciones de terminal tonta que van más allá de las disponibles en un teletipo puro, y que los programas pueden utilizar. Estas comprenden (principalmente) códigos de escape que se pueden enviar o recibir del terminal. Los códigos de escape enviados al terminal realizan diversas funciones que un terminal CRT (o un emulador de terminal de software) puede realizar pero que un teletipo no, como mover el cursor del terminal a posiciones en la pantalla, borrar y desplazar toda o parte de la pantalla, encender y apagar dispositivos de impresión conectados, teclas de función programables, cambiar los colores y atributos de la pantalla (como vídeo inverso ) y establecer cadenas de título de pantalla. Los códigos de escape recibidos del terminal representan acciones como teclas de función , teclas de flecha y otras combinaciones de teclas especiales ( tecla Inicio , tecla Fin , tecla Ayuda , tecla AvPág , tecla RePág , tecla Insertar , tecla Suprimir , etc.). [ 8 ] [ 9 ]

Estas capacidades están codificadas en bases de datos configuradas por un administrador del sistema y a las que se accede desde programas mediante la biblioteca terminfo (que reemplaza a la antigua biblioteca termcap ), sobre la cual se construyen a su vez bibliotecas como curses y ncurses . Los programas de aplicación utilizan las capacidades de terminal para proporcionar interfaces de usuario textuales con ventanas, cuadros de diálogo, botones, etiquetas, campos de entrada, menús, etc. [ 10 ] [ 11 ]

Control de variables ambientales: TERMet al.

El conjunto particular de capacidades para la terminal que utiliza la entrada y salida de un programa (consciente de la terminal) se obtiene de la base de datos en lugar de estar integrado en los programas y bibliotecas, y se controla mediante la TERMvariable de entorno (y, opcionalmente para las bibliotecas termcap y terminfo, las variables de entorno TERMCAPy , respectivamente). [ 10 ] Esta variable la establece el programa monitor de terminal que genera los programas que luego utilizan esa terminal para su entrada y salida, o a veces explícitamente. Por ejemplo:TERMINFO

  • El programa getty (o equivalente) establece la TERMvariable de entorno de acuerdo con una base de datos del sistema ( inittab o los archivos de configuración de los programas ttymon o launchd ) que define qué terminales locales están conectados a qué puertos serie y qué tipos de terminales proporcionan las terminales virtuales locales o la consola del sistema local.
  • Un usuario de acceso telefónico en un terminal remoto no utiliza el tipo de terminal que el sistema suele esperar en esa línea, por lo que configura manualmente la TERMvariable de entorno inmediatamente después de iniciar sesión con el tipo correcto. (Lo más habitual es que el tipo de terminal configurado por el programa getty para la línea de acceso telefónico, que el administrador del sistema ha determinado que es el más utilizado por los usuarios de acceso telefónico con terminales remotos, coincida con el utilizado por el usuario, por lo que este no necesita modificar el tipo de terminal).
  • El demonio del servidor SSH (o equivalente, como el demonio rlogin ) establece la TERMvariable de entorno al mismo tipo de terminal que el cliente SSH. [ 12 ]
  • El emulador de terminal de software, usando una pseudoterminal, establece la TERMvariable de entorno para especificar el tipo de terminal que está emulando. Las terminales emuladas a menudo no coinciden exactamente con el hardware de terminal real, y los emuladores de terminal tienen nombres de tipo dedicados para su uso. El programa xterm (por defecto) establece xtermcomo tipo de terminal, por ejemplo. [ 13 ] El programa GNU Screen establece screencomo tipo de terminal.

Control de trabajo

Los terminales proporcionan funciones de control de trabajos. De forma interactiva, el usuario del terminal puede enviar caracteres de control que suspenden el trabajo que se está ejecutando, volviendo al intérprete de comandos interactivo que inició el trabajo, y puede ejecutar comandos que colocan trabajos en segundo plano o que cambian otro trabajo en segundo plano al primer plano (reanudándolo si es necesario). [ 14 ] [ 15 ]

Disciplinas de línea

En sentido estricto, en los sistemas Unix un dispositivo terminal comprende el controlador de dispositivo tty subyacente , responsable del control físico del hardware del dispositivo mediante instrucciones de E/S y del manejo de las solicitudes de interrupción del dispositivo para la entrada y salida de caracteres, y la disciplina de línea . Una disciplina de línea es independiente del hardware real del dispositivo, y la misma disciplina de línea puede usarse tanto para un concentrador de terminales responsable del control de múltiples terminales como para un pseudoterminal. De hecho, la disciplina de línea (o, en el caso de BSD, AIX y otros sistemas, las disciplinas de línea ) es la misma en todos los dispositivos terminales. Es la disciplina de línea la responsable del eco local, la edición de línea, el procesamiento de los modos de entrada, el procesamiento de los modos de salida y la asignación de caracteres. Todas estas funciones son independientes del hardware real, ya que operan con las abstracciones simples proporcionadas por los controladores de dispositivo tty: transmitir un carácter, recibir un carácter, establecer varios estados de hardware. [ 16 ] [ 17 ]

En la séptima edición de Unix , los sistemas BSD y sus derivados, incluyendo macOS , y Linux , cada dispositivo terminal puede cambiar entre múltiples disciplinas de línea. [ 18 ] En el sistema AT & T STREAMS , las disciplinas de línea son módulos STREAMS que pueden insertarse y extraerse de una pila de E/S STREAMS. [ 19 ]

Historia

La interfaz de terminal POSIX deriva de las interfaces de terminal de varios sistemas Unix.

Primeras versiones de Unix: Séptima edición de Unix

La interfaz de terminal proporcionada por Unix 32V y Seventh Edition Unix, y también presentada por BSD versión 4 como el antiguo controlador de terminal , era sencilla y estaba orientada principalmente a los teletipos como terminales. La entrada se introducía línea por línea, y el controlador de terminal del sistema operativo (y no los propios terminales) proporcionaba funciones básicas de edición de línea. El núcleo mantenía un búfer donde se realizaba la edición. Las aplicaciones que leían la entrada del terminal recibían el contenido del búfer solo cuando returnse pulsaba la tecla para finalizar la edición de línea. La tecla enviada desde el terminal al sistema borraba ("eliminaba") todo el contenido actual del búfer de edición y normalmente se mostraba como un símbolo " @ " seguido de una secuencia de salto de línea para mover la posición de impresión a una nueva línea en blanco. La tecla enviada desde la terminal al sistema borraría el último carácter del final del búfer de edición y normalmente se mostraría como un símbolo ' # ', que los usuarios tendrían que reconocer como una indicación de "borrado" del carácter precedente (los teletipos no son físicamente capaces de borrar caracteres una vez impresos en el papel). [ 20 ] [ 21 ] [ 22 ] [ 23 ] [ 18 ]@#

Desde el punto de vista de la programación, un dispositivo terminal tenía velocidades de transmisión y recepción en baudios , caracteres de "borrar" y "eliminar" (que realizaban la edición de línea, como se explicó), caracteres de "interrupción" y "salida" (que generaban señales a todos los procesos para los que el terminal era un terminal de control), caracteres de "inicio" y "parada" (utilizados para el control de flujo del módem ), un carácter de "fin de archivo" (que actuaba como un retorno de carro excepto que era descartado del búfer por la read()llamada al sistema y, por lo tanto, potencialmente causaba que se devolviera un resultado de longitud cero) y varias banderas de modo básicas que determinaban si el controlador de terminal del kernel emulaba el eco local , si el control de flujo del módem estaba habilitado, las longitudes de varios retardos de salida, la asignación para el carácter de retorno de carro y los tres modos de entrada. [ 24 ]

Los tres modos de entrada fueron:

modo de línea (también llamado modo "cocido")

En el modo de línea, la disciplina de línea realiza todas las funciones de edición de línea, reconoce los caracteres de control "interrupción" y "salida" y los transforma en señales que se envían a los procesos. Los programas de aplicación que leen desde la terminal reciben líneas completas una vez que el usuario ha finalizado la edición de línea pulsando Intro. [ 21 ] [ 25 ]

modo de corte

El modo cbreak es uno de los dos modos de lectura carácter por carácter. ( Stephen R. Bourne se refirió a él en tono de broma ( Bourne 1983 , p. 288) como un modo "medio cocido" y, por lo tanto, "poco hecho"). La disciplina de línea no realiza edición de línea, y las secuencias de control para las funciones de edición de línea se tratan como entrada de caracteres normal. Los programas de aplicación que leen desde la terminal reciben los caracteres inmediatamente, tan pronto como están disponibles en la cola de entrada para ser leídos. Sin embargo, los caracteres de control "interrupción" y "salida", así como los caracteres de control de flujo del módem, todavía se manejan de manera especial y se eliminan del flujo de entrada. [ 26 ] [ 27 ] 

modo sin procesar
El modo sin procesar es el otro de los dos modos de lectura carácter por carácter. La disciplina de línea no realiza edición de línea, y las secuencias de control tanto para las funciones de edición de línea como para los distintos caracteres especiales ("interrupción", "salir" y control de flujo) se tratan como entrada de caracteres normal. Los programas de aplicación que leen desde el terminal reciben los caracteres inmediatamente y reciben todo el flujo de caracteres sin alteraciones, tal como proviene del propio dispositivo terminal. [ 28 ] [ 26 ] [ 27 ]

La interfaz programática para consultar y modificar todos estos modos y caracteres de control era la ioctl()llamada al sistema . (Esto reemplazó las llamadas al sistema stty()y de la Sexta Edición de Unix). [ 29 ] [ 30 ] Aunque los caracteres "borrar" y "eliminar" eran modificables desde sus valores predeterminados de y , durante muchos años fueron los valores predeterminados preestablecidos en los controladores de dispositivos de terminal, y en muchos sistemas Unix, que solo alteraban la configuración del dispositivo de terminal como parte del proceso de inicio de sesión, en los scripts de inicio de sesión del sistema que se ejecutaban después de que el usuario hubiera ingresado el nombre de usuario y la contraseña, cualquier error en las solicitudes de inicio de sesión y contraseña tenía que corregirse utilizando los caracteres de teclas de edición histórica heredados de los terminales de teletipo. [ 23 ]gtty()#@

BSD: el advenimiento del control de trabajos

Con los sistemas Unix BSD llegó el control de trabajos y un nuevo controlador de terminal con capacidades extendidas. [ 18 ] Estas extensiones comprendían caracteres especiales adicionales (nuevamente modificables mediante programación):

  • Los caracteres "suspend" y "delayed suspension" (por defecto + y + ASCII y ) provocaron la generación de una nueva señal a los procesos en el grupo de procesos de control del terminal. [ 27 ]ControlZControlYSUBEMSIGTSTP
  • Los caracteres "borrar palabra", "siguiente literal" y "reimprimir" (por defecto + , + , y + ASCII , , y ) realizaban funciones adicionales de edición de línea. "borrar palabra" borraba la última palabra al final del búfer de edición de línea. "siguiente literal" permitía introducir cualquier carácter especial en el búfer de edición de línea (una función disponible, aunque algo inconveniente, en la Séptima Edición de Unix mediante el carácter de barra invertida). "reimprimir" hacía que la disciplina de línea reimprimiera el contenido actual del búfer de edición de línea en una nueva línea (útil cuando otro proceso en segundo plano había generado una salida que se había mezclado con la edición de línea). [ 27 ]ControlWControlVControlRETBSYNDC2

La interfaz programática para consultar y modificar todos estos modos adicionales y caracteres de control seguía siendo la ioctl()llamada al sistema, que sus creadores ( Leffler et al. 1989 , p. 262) describieron como una "interfaz bastante desordenada". Se conservó toda la funcionalidad original de la Séptima Edición de Unix, y se añadió la nueva funcionalidad mediante códigos de operación adicionales, lo que dio como resultado una interfaz programática que claramente había crecido y que presentaba cierta duplicación de funcionalidades. [ 31 ] ioctl()

Sistema III y Sistema V

System III introdujo una nueva interfaz de programación que combinaba ioctl()las operaciones separadas de la Séptima Edición para obtener y establecer indicadores y caracteres de control en llamadas que utilizaban una termioestructura para almacenar tanto indicadores como caracteres de control, y que podían obtenerlos en una sola operación y establecerlos en otra. También dividió algunos de los indicadores de la interfaz de la Séptima Edición en varios indicadores separados y añadió algunas capacidades adicionales, aunque no admitía el control de trabajos ni las mejoras del modo "cooked" de 4BSD. [ 32 ] Por ejemplo, reemplazó los modos "cooked", "cbreak" y "raw" de la Séptima Edición con abstracciones diferentes. El reconocimiento de caracteres generadores de señales es independiente del modo de entrada, y solo existen dos modos de entrada: canónico y no canónico. (Esto permite un modo de entrada de terminal que no está presente en la Séptima Edición ni en BSD: modo canónico con la generación de señales deshabilitada).

Los sucesores del Sistema III, incluido el Sistema V , utilizaban la misma interfaz.

POSIX: Consolidación y abstracción

Uno de los principales problemas que el estándar POSIX abordó con su definición de una interfaz de terminal general fue la gran cantidad de interfaces programáticas. Si bien para la época del estándar el comportamiento de las terminales era bastante uniforme de un sistema a otro, ya que la mayoría de los sistemas Unix habían adoptado las nociones de disciplinas de línea y las capacidades de control de trabajos de BSD, la interfaz programática a las terminales mediante la ioctl()llamada al sistema era un caos. Los distintos sistemas Unix proporcionaban ioctl()operaciones diferentes, con nombres (simbólicos) distintos y diferentes indicadores. El código fuente portable debía contener una cantidad significativa de compilación condicional para adaptarse a las diferencias entre las plataformas de software, aunque todas fueran, en teoría, Unix. [ 33 ]

El estándar POSIX reemplaza ioctl()completamente el sistema con un conjunto de funciones de biblioteca (que, por supuesto, pueden implementarse internamente mediante ioctl()operaciones específicas de la plataforma) con nombres y parámetros estandarizados. La termioestructura de datos de System V Unix se utilizó como plantilla para la termiosestructura de datos POSIX, cuyos campos permanecieron prácticamente sin cambios, salvo que ahora utilizaban tipos de datos alias para especificarlos, lo que permitía a los implementadores portarlos fácilmente a través de múltiples arquitecturas de procesador, en lugar de requerir explícitamente los tipos de unsigned shortdatos charde los lenguajes de programación C y C++ (que podrían tener tamaños inconvenientes en algunas arquitecturas de procesador). [ 33 ] [ 34 ]

POSIX también introdujo soporte para el control de trabajos, con la termiosestructura que contiene caracteres de suspensión y suspensión retardada además de los caracteres de control admitidos por System III y System V. No agregó ninguna de las extensiones de cook-mode de BSD, aunque SunOS 4.x, los sistemas System V Release 4, incluidos Solaris , HP-UX , AIX , BSD más recientes, macOS y Linux las han implementado como extensiones a termios.

Lo que define la norma

Control de terminales y grupos de procesos

Cada proceso del sistema tiene un único terminal de control o ninguno. Un proceso hereda su terminal de control de su proceso padre, y las únicas operaciones que se pueden realizar sobre un proceso son adquirir un terminal de control, por parte de un proceso que no lo tiene, y renunciar a él, por parte de un proceso que sí lo tiene. [ 33 ]

No se define ninguna forma portátil de adquirir un terminal de control, el método está definido por la implementación. El estándar define la O_NOCTTYbandera para la open()llamada al sistema , que es la forma de evitar lo que de otro modo sería la forma convencional de adquirir un terminal de control (un proceso sin terminal de control open()sa terminal device file que no sea ya el terminal de control para algún otro proceso, sin especificar la O_NOCTTYbandera [ 35 ] ), pero deja su semántica convencional opcional.

Cada proceso también es miembro de un grupo de procesos. Cada dispositivo terminal registra un grupo de procesos que se denomina su grupo de procesos en primer plano . Los grupos de procesos controlan el acceso al terminal y la entrega de señales. Las señales generadas en el terminal se envían a todos los procesos que son miembros del grupo de procesos en primer plano del terminal. Las operaciones read()de write()E/S en un terminal por un proceso que no es miembro del grupo de procesos en primer plano del terminal harán que opcionalmente (respectivamente) se envíen señales ( SIGTTINy SIGTTOUrespectivamente) al proceso que las invoca. Varias funciones de biblioteca que alteran el modo del terminal tienen el mismo comportamiento que write(), excepto que siempre generan las señales, incluso si esa funcionalidad está desactivada para write()sí misma. [ 36 ] [ 37 ]

La termiosestructura de datos

La estructura de datos utilizada por todas las llamadas a la biblioteca de terminal es la termiosestructura, [ 38 ] cuya definición en lenguaje de programación C y C++ es la siguiente: [ 34 ]

struct termios { tcflag_t c_iflag ; // Modos de entrada tcflag_t c_oflag ; // Modos de salida tcflag_t c_cflag ; // Modos de control tcflag_t c_lflag ; // Modos locales cc_t c_cc [ NCCS ]; // Caracteres de control };

El orden de los campos dentro de la termiosestructura no está definido, y las implementaciones pueden agregar campos no estándar. [ 34 ] De hecho, las implementaciones deben agregar campos no estándar para registrar las velocidades de transmisión de entrada y salida. Estos se registran en la estructura, en un formato definido por la implementación, y se accede a ellos mediante funciones de acceso, en lugar de mediante la manipulación directa de los valores de los campos, como ocurre con los campos de la estructura estandarizada. [ 39 ]

Los alias de tipo de datos tcflag_ty cc_t, así como la constante simbólica NCCSy las constantes simbólicas para los distintos indicadores de modo, nombres de caracteres de control y velocidades de transmisión, se definen en un encabezado estándar termios.h. (Esto no debe confundirse con el encabezado de nombre similar termio.hde System III y System V, que define una termioestructura similar y muchas constantes simbólicas de nombre similar. Esta interfaz es específica de System III y System V, y el código que la utiliza no será necesariamente portable a otros sistemas). [ 40 ]

Los campos de la estructura son (en resumen, para más detalles consulte el artículo principal ):

c_iflag
indicadores de modo de entrada para controlar la paridad de entrada, la traducción de salto de línea de entrada, el control de flujo del módem , la limpieza de 8 bits y la respuesta a una condición de "ruptura" (del puerto serie) [ 34 ]
c_oflag
indicadores de modo de salida para controlar el posprocesamiento de salida definido por la implementación, la traducción de salto de línea de salida y los retrasos de salida después de que se hayan enviado varios caracteres de control [ 41 ] [ 27 ]
c_cflag
Indicadores de control de hardware del terminal para controlar el dispositivo terminal real en lugar de la disciplina de línea: el número de bits en un carácter, tipo de paridad, control de desconexión y control de flujo de línea serie [ 42 ]
c_lflag
indicadores de control local para controlar la disciplina de línea en lugar del hardware del terminal: modo canónico, modos de eco, reconocimiento y manejo de caracteres de generación de señal y habilitación de la generación de la SIGTTOUseñal por la write()llamada al sistema [ 39 ]

Las funciones de la biblioteca son (en resumen, para más detalles consulte el artículo principal ):

tcgetattr()
consultar la configuración de atributos actual de un dispositivo terminal en una termiosestructura [ 43 ]
tcsetattr()
establecer la configuración de atributos actual de un dispositivo terminal a partir de una termiosestructura, esperando opcionalmente a que se vacíe la salida en cola y vaciando la entrada en cola [ 43 ]
cfgetispeed()
consultar la velocidad de baudios de entrada a partir de los campos definidos por la implementación en una termiosestructura [ 44 ]
cfgetospeed()
consultar la velocidad de baudios de salida de los campos definidos por la implementación en una termiosestructura [ 44 ]
cfsetispeed()
establecer la velocidad de baudios de entrada en los campos definidos por la implementación en una termiosestructura [ 44 ]
cfsetospeed()
establecer la velocidad de baudios de salida en los campos definidos por la implementación en una termiosestructura [ 44 ]
tcsendbreak()
enviar una señal de "ruptura" del módem en un terminal de dispositivo serie [ 45 ]
tcdrain()
esperar a que se vacíe la salida en cola [ 45 ]
tcflush()
descartar entrada en cola [ 45 ]
tcflow()
control de flujo de cambios [ 45 ]
tcgetpgrp()
consultar el grupo de procesos en primer plano de la terminal [ 46 ]
tcsetpgrp()
establecer el grupo de procesos en primer plano del terminal [ 46 ]

Personajes especiales

El miembro de matriz de la estructura de datos especifica todos los caracteres especiales (modificables mediante programación). Los índices de la matriz son constantes simbólicas, una para cada tipo de carácter especial, como se muestra en la tabla de la derecha. (Otras dos entradas de la matriz son relevantes para el procesamiento de entrada en modo no canónico y se analizan más adelante). [ 43 ]c_cc[]termios

Los caracteres especiales no modificables mediante programación son el salto de línea (ASCII LF) y el retorno de carro (ASCII CR). [ 47 ]

Procesamiento de entrada

El procesamiento de entrada determina el comportamiento de la read()llamada al sistema en un dispositivo terminal y las características de edición de línea y generación de señales de la disciplina de línea. A diferencia del caso de Unix de séptima edición y BSD versión 4, y como en el caso de System III y System V, la edición de línea opera en uno de solo dos modos: modo canónico y modo no canónico. La diferencia básica entre ellos radica en cuándo, desde el punto de vista de los requisitos de bloqueo/no bloqueo de la read()llamada al sistema (especificados con el O_NONBLOCKindicador en el descriptor de archivo a través de open()o fcntl()), los datos "están disponibles para lectura". [ 48 ]

Procesamiento en modo canónico

En el modo canónico, los datos se acumulan en un búfer de edición de línea y no están disponibles para su lectura hasta que el usuario finaliza la edición de línea (en la terminal) enviando un carácter delimitador de línea . Los caracteres delimitadores de línea son caracteres especiales: fin de archivo , fin de línea y salto de línea (ASCII LF). Los dos primeros se pueden configurar mediante programación, mientras que el último es fijo. Los dos últimos se incluyen en el búfer de edición de línea, mientras que el primero no. [ 49 ]

Más estrictamente, se acumulan cero o más líneas en el búfer de edición de línea, separadas por delimitadores de línea (que pueden o no descartarse read()al leerlas), y la edición de línea opera sobre la parte del búfer de edición de línea que sigue al último delimitador de línea (si lo hay). Así, por ejemplo, el carácter de "borrado" (sea cual sea su función programada) borrará el último carácter del búfer de línea solo hasta (pero sin incluir) un delimitador de línea precedente. [ 49 ]

Procesamiento en modo no canónico

En modo no canónico, los datos se acumulan en un búfer (que puede o no ser el búfer de edición de línea ; algunas implementaciones tienen colas separadas de "entrada procesada" y "entrada sin procesar") y se vuelven "disponibles para lectura" según los valores de dos parámetros de control de entrada, los miembros y de la estructura de datos. Ambos son cantidades sin signo (porque se requiere que sea un alias para un tipo sin signo). El primero especifica un número mínimo de caracteres y el segundo especifica un tiempo de espera en décimas de segundo. [ 50 ] Hay cuatro posibilidades:c_cc[MIN]c_cc[TIME]termioscc_t

c_cc[TIME]y ambos son ceroc_cc[MIN]
En este caso, los datos en el búfer están "disponibles para lectura" inmediatamente, y read()devuelve inmediatamente los datos que haya en el búfer (posiblemente devolviendo cero si no hay datos disponibles). [ 51 ]
c_cc[TIME]es distinto de cero y es ceroc_cc[MIN]
En este caso, los datos en el búfer están "disponibles para lectura" después de que haya transcurrido el tiempo de espera especificado, que se activa al iniciar la read()llamada al sistema o al recibir un solo carácter. En otras palabras, read()espera un tiempo total máximo especificado y puede devolver cero datos, o bien devuelve cualquier dato tan pronto como se recibe. [ 51 ]
c_cc[TIME]es cero y es distinto de ceroc_cc[MIN]
En este caso, los datos en el búfer están "disponibles para lectura" después de que se haya recibido el número especificado de caracteres en el búfer. En otras palabras, read()espera una cantidad mínima de datos (que puede ser mayor que la que el llamador está preparado para leer en la llamada al sistema), no devolverá datos cero y puede esperar indefinidamente. [ 51 ]
c_cc[TIME]y ambos son distintos de ceroc_cc[MIN]
En este caso, los datos en el búfer están "disponibles para lectura" después de que se haya recibido el número especificado de caracteres en el búfer o haya expirado el tiempo de espera desde que se ingresó el último carácter. No hay tiempo de espera para el primer carácter. En otras palabras, read()espera una cantidad mínima de datos (que puede ser mayor que la que el llamador está preparado para leer en la llamada al sistema), no devolverá datos cero, puede esperar indefinidamente, pero no esperará más allá del tiempo de espera especificado si hay al menos un carácter en el búfer para ser leído. [ 51 ]

Procesamiento de salida

El procesamiento de salida permanece prácticamente sin cambios con respecto a sus orígenes en los sistemas III y V. Los indicadores de control del modo de salida determinan diversas opciones:

  • Se pueden insertar retornos de carro antes de cada carácter de salto de línea para traducir la semántica de salto de línea de Unix a la semántica ASCII que esperan muchos terminales. [ 27 ] [ 22 ]
  • Se puede dar tiempo a los terminales para que ejecuten varios códigos de control que (en un teletipo o similar) producirían movimientos físicos del carro que podrían consumir una cantidad de tiempo significativa (desde el punto de vista del ordenador), como retrocesos, tabulaciones horizontales, retornos de carro, saltos de página y saltos de línea. [ 27 ] [ 52 ]

Notas

  1. 1 2 3 Cristiano 1988 , pág. 11.
  2. Bourne 1983 , pág. 6.
  3. Coffin 1991 , pág. 820.
  4. Coffin 1991 , págs .  23-24.
  5. ^ Leffler y col. 1989 , pág. 259.
  6. 1 2 Coffin 1991 , pág. 24.
  7. ^ Leffler y col. 1989 , pág. 37 38.
  8. Afzal 2008 , pág. 419.
  9. Frisch 2002 , pág. 770.
  10. 1 2 Coffin 1991 , pág. 115.
  11. Coffin 1991 , pág. 372.
  12. Coffin 1991 , pág. 779.
  13. Coffin 1991 , págs .  751-752.
  14. ^ Leffler y col. 1989 , pág. 265.
  15. ^ Leffler y col. 1989 , pág. 103.
  16. ^ Leffler y col. 1989 , pág. 38.
  17. ^ Leffler y col. 1989 , pág. 260 261.
  18. ^ Leffler y cols. 1989 , pág. 262.
  19. Christian 1988 , pág. 395.
  20. Bourne 1983 , pág. 8.
  21. 1 2 Bourne 1983 , págs .  130-131.
  22. 1 2 Bourne 1983 , pág. 287.
  23. 1 2 Christian 1988 , pág. 26.
  24. Bourne 1983 , págs .  132-133.
  25. ^ Leffler y col. 1989 , pág. 259 260.
  26. 1 2 Bourne 1983 , pág. 288.
  27. ^ Leffler et al . ​1989 , pág. 260.
  28. Bourne 1983 , pág. 132.
  29. Bourne 1983 , pág. 133.
  30. Christian 1988 , pág. 393.
  31. ^ Leffler y col. 1989 , pág. 262 263.
  32. "Fuente de la página man del sistema III tty(4)" . Consultado el 5 de octubre de 2012 .
  33. 1 2 3 Zlotnick 1991 , pág. 157.
  34. 1 2 3 4 Zlotnick 1991 , pág. 163.
  35. Bourne 1983 , pág. 130.
  36. Zlotnick 1991 , pág. 158.
  37. Zlotnick 1991 , págs .  173-174.
  38. Zlotnick 1991 , pág. 162.
  39. 1 2 Zlotnick 1991 , pág. 166.
  40. Zlotnick 1991 , págs .  162-163.
  41. Zlotnick 1991 , pág. 164.
  42. Zlotnick 1991 , pág. 165.
  43. 1 2 3 Zlotnick 1991 , pág. 167.
  44. 1 2 3 4 5 Zlotnick 1991 , pág. 169.
  45. 1 2 3 4 Zlotnick 1991 , pág. 172.
  46. 1 2 Zlotnick 1991 , pág. 174.
  47. 1 2 Zlotnick 1991 , pág. 159.
  48. Zlotnick 1991 , pág. 160.
  49. 1 2 Zlotnick 1991 , págs .  160-161.
  50. Zlotnick 1991 , pág. 161.
  51. 1 2 3 4 Zlotnick 1991 , págs. 161-162 .
  52. Bourne 1983 , págs .  287-288.

Fuentes

  • Afzal, Amir (2008). UNIX sin límites: una introducción (5.ª  ed.). Prentice Hall. ISBN 978-0-13-119449-6.
  • Bourne, Stephen R. (1983). El sistema UNIX . Serie internacional de ciencias de la computación. Addison-Wesley. ISBN 978-0-201-13791-0.
  • Christian, Kaare (1988). El sistema operativo UNIX (2.ª  ed.). John Wiley & Sons. ISBN 978-0-471-84781-6.
  • Coffin, Stephen (1991). UNIX system V release 4: the complete reference . Osborne McGraw-Hill. ISBN 978-0-07-881653-6.
  • Frisch, Æleen (2002). Administración de sistemas esencial . Un manual conciso (3.ª  ed.). O'Reilly Media, Inc. ISBN 978-0-596-00343-2.
  • Leffler, Samuel J.; McKusick, Marshall Kirk ; Karels, Michael J.; Quarterman, John S. (1989). "Manejo de terminales". Diseño e implementación del sistema operativo UNIX 4.3BSD . Serie Addison-Wesley en ciencias de la computación. Addison-Wesley. ISBN 978-0-201-06196-3.
  • Zlotnick, Fred (1991). "Control de dispositivos terminales". El estándar POSIX.1: una guía para programadores . Benjamin/Cummings Pub. Co. ISBN 978-0-8053-9605-8.

Lecturas adicionales

  • "11. Interfaz general de terminal" . Especificaciones básicas de The Open Group . 6. The Open Group . 2004.
  • Lewine, Donald A. (1991). "E/S de terminal". Guía del programador POSIX: escritura de programas UNIX portátiles con el estándar POSIX.1 . Serie de Ciencias de la Computación. O'Reilly Media, Inc. ISBN 978-0-937175-73-6.