La disciplina de línea [1] ( en inglés linedisciplina, ldisc ) es una capa de abstracción del subsistema de dispositivos terminales (tty) de los sistemas operativos tipo UNIX , necesaria para simular las capacidades correspondientes de una terminal de hardware . Esta capa se encuentra entre el controlador de la consola y el controlador UART [2] .
La conexión al controlador UART se realiza a través de un canal bidireccional. Este esquema tiene varias variaciones. Por ejemplo, el dispositivo de teletipo virtual /dev/tty puede actuar como un controlador UART ; en este caso, los procesos en la máquina local pueden funcionar con la terminal virtual existente. Si el trabajo se lleva a cabo a través de un UART físico, dicho esquema proporciona comunicación con el proceso en una estación de trabajo remota, es decir, el modo de terminal remoto.
La conexión a la consola se realiza a través de dos canales unidireccionales: un canal de entrada y un canal de salida. Aquí, también, las variaciones son posibles. Si se usa un controlador de terminal virtual UNIX como consola, entonces, a través de dicha consola virtual, el usuario puede trabajar en un sistema UNIX en modo de texto de pantalla completa, cambiando entre consolas usando teclas de acceso rápido . En lugar de un controlador de consola, la interfaz ldisc se puede exportar a través de un archivo de dispositivo como /dev/ttyS0. En este caso, un programa de comunicaciones como minicom puede interactuar con ldisc.
También hay un esquema de conexión ldisc, en el que tanto la consola como el UART se reemplazan con archivos de dispositivos virtuales. Tal esquema se llama pseudo-terminal.. En este caso, un dispositivo maestro como /dev/ptyp1 reemplaza la consola y es utilizado por un programa especializado como tmux , xterm o socat . Un dispositivo esclavo como /dev/ttyp1 reemplaza el UART y puede ser utilizado por cualquier proceso de usuario.
El módulo de disciplina de línea proporciona un búfer para recibir una línea del canal de salida de la consola, procesa los caracteres de control de edición de línea (que no debe confundirse con las secuencias de control de terminal) y también proporciona una implementación del mecanismo de eco : envía los caracteres recibidos de la consola de vuelta a través del canal de entrada de la consola. Después del procesamiento, la cadena del búfer se envía al canal UART. Los datos recibidos del canal UART, después del procesamiento, se envían al canal de entrada de la consola.
Es la capa ldisc la que determina cómo funcionan las llamadas al sistema , como read(2) y write(2), cuando se trabaja con varios archivos de dispositivos de terminal . Se puede controlar mediante la llamada al sistema ioctl(2) (o mediante la función contenedora de la biblioteca tcsetattr(3) ) si al menos uno de sus componentes asociados se exporta a través de un archivo de dispositivo. Al mismo tiempo, no importa qué componente se exporte: el control se puede llevar a cabo tanto a través del dispositivo maestro como del esclavo. Por ejemplo, usando el archivo de dispositivo /dev/tty (correspondiente al lado esclavo), puede controlar el modo eco de la consola, y usando el archivo de dispositivo /dev/ttyS0 (correspondiente al lado maestro), puede controlar el modo eco para el propio programa de comunicación: con eco habilitado, todo lo escrito en /dev/ttyS0 se puede leer inmediatamente hacia atrás.
Si el programa usa su propio procesamiento de línea, como el uso de las bibliotecas Ncurses o Readline , entonces el mecanismo de procesamiento de línea proporcionado por el subsistema del dispositivo terminal se puede desactivar configurando ldisc en modo sin procesar. En este modo, los datos recibidos del canal de salida de la consola se envían al canal UART y los datos recibidos del UART se envían al canal de entrada de la consola. En este modo no se realiza ningún procesamiento de datos.