GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuáles son las responsabilidades de cada componente de pseudoterminal (pty) (software, lado maestro, lado esclavo)?

Estoy tratando de averiguar cómo funciona un tty (el flujo de trabajo y las responsabilidades de cada elemento). He leído varios artículos interesantes al respecto, pero todavía hay algunas áreas borrosas.

Esto es lo que entiendo hasta ahora:

  • El terminal emulado realiza diferentes llamadas al sistema a /dev/ptmx , la parte maestra del pseudo-terminal.
  • La parte maestra del pseudo terminal asigna un archivo en /dev/pts/[0-N] , correspondiente al puerto serie obsoleto, y le "conecta" un pseudo terminal esclavo.
  • La pseudo terminal esclava guarda información como el ID de la sesión, el trabajo en primer plano y el tamaño de la pantalla.

Estas son mis preguntas:

  1. Tiene ptmx ¿Algún propósito además de asignar la parte esclava? ¿Proporciona algún tipo de "inteligencia" , o el terminal emulado
    (xterm por ejemplo) tiene toda la inteligencia de comportarse como un
    terminal?
  2. ¿Por qué xterm? tiene que interactuar con la parte maestra, ya que solo reenvía la salida estándar y la entrada estándar de la parte esclava? ¿Por qué no puede
    escribir y leer directamente desde el archivo pts ?
  3. ¿Siempre se adjunta un ID de sesión a un archivo pts y viceversa?
    ¿Podría escribir un comando ps y encontrar 2 ID de sesión para el mismo
    /dev/pts/X ?
  4. ¿Qué otra información tiene el pts ¿Tienda? ¿Xterm actualiza todos los campos
    por sí mismo, o el ptm agregar algo de "inteligencia" en él?

Respuesta aceptada:

Emuladores de terminales

El lado maestro reemplaza la línea (el par de cables TX/RX) que va al terminal.

La terminal muestra los caracteres que recibe por uno de los hilos (algunos de ellos son caracteres de control y hacen que haga cosas como mover el cursor, cambiar de color…) y envía por otro hilo los caracteres correspondientes a las teclas que pulsas.

Emuladores de terminal como xterm no son diferentes, excepto que en lugar de enviar y recibir caracteres por cable, leen y escriben caracteres en su descriptor de archivo en el lado maestro. Una vez que han generado la terminal esclava y han iniciado su caparazón en eso, ya no lo tocan. Además de emular el par de cables, xterm también puede cambiar algunas de las propiedades de disciplina de línea a través de ese descriptor de archivo al lado maestro. Por ejemplo, pueden actualizar los atributos de tamaño para que se envíe un SIGWINCH a las aplicaciones que interactúan con el dispositivo esclavo para notificarles el cambio de tamaño.

Aparte de eso, hay poca inteligencia en el terminal/emulador de terminal.

Lo que escribe en un dispositivo de terminal (como el esclavo pty) es lo que quiere que se muestre allí, lo que lee de él es lo que ha escrito allí, por lo que no tiene sentido que el emulador de terminal lea o escriba eso. . Son los del otro extremo.

La disciplina de la línea tty

Gran parte de la inteligencia está en la disciplina de la línea tty . La disciplina de línea es un módulo de software (que reside en el controlador, en el núcleo) colocado encima de un dispositivo serial/pty que se encuentra entre ese dispositivo y la línea/cable (el lado maestro de un pty).

Una línea serial puede tener una terminal en el otro extremo, pero también un mouse u otra computadora para la red. Puede adjuntar una disciplina de línea SLIP, por ejemplo, para obtener una interfaz de red sobre un dispositivo serie (o dispositivo pty), o puede tener un tty disciplina de línea. La disciplina de línea tty es la disciplina de línea predeterminada al menos en Linux para dispositivos serie y pty. En Linux, puede cambiar la disciplina de línea con ldattach .

Puede ver el efecto de deshabilitar la disciplina de línea tty emitiendo stty raw -echo (tenga en cuenta que el aviso de bash u otras aplicaciones interactivas como vi configure el terminal en el modo exacto que necesitan, por lo que desea usar una aplicación tonta como cat experimentar con eso).
Entonces, todo lo que se escribe en el dispositivo terminal esclavo pasa inmediatamente al lado maestro para que xterm lo lea, y cada carácter escrito por xterm al lado maestro está inmediatamente disponible para leer desde el dispositivo esclavo.

Relacionado:¿Cómo completar bash para alias de comando?

La disciplina de línea es donde el editor de línea interna del dispositivo terminal está implementado. Por ejemplo, con stty icanon echo (como es el valor predeterminado), cuando escribe a , xterm escribe a al maestro, entonces la disciplina de línea hace eco lo devuelve (hace un a disponible para lectura por xterm para visualización), pero no hace que nada esté disponible para lectura en el lado esclavo. Luego, si escribe retroceso, xterm envía un ^? o ^H carácter, la disciplina de línea (como que ^? o ^H corresponde al erase configuración de disciplina de línea) devuelve al maestro un ^H , space y ^H para xterm para borrar el a acaba de escribir en su pantalla y todavía no envía nada a la aplicación leyendo desde el lado esclavo, solo actualiza su búfer de editor de línea interno para eliminar ese a has escrito antes.

Luego, cuando presiona Enter, xterm envía ^M (CR), que la disciplina de línea convierte en la entrada a ^J (LF), y envía lo que ha ingresado hasta ahora para leer en el lado esclavo (una aplicación que lee en /dev/pts/x recibirá lo que ha escrito, incluido el LF, pero no el a ya que lo ha eliminado), mientras que en el lado maestro, envía un CR y LF para mover el cursor a la siguiente línea y al inicio de la pantalla.

La disciplina de línea también es responsable de enviar el SIGINT señal al grupo de procesos de primer plano de la terminal cuando recibe un ^C personaje en el lado maestro, etc.

Muchas aplicaciones de terminal interactivo desactivan la mayoría de las características de esa disciplina de línea para implementarla ellos mismos. Pero en cualquier caso, cuidado con que la terminal (xterm ) tiene poca participación en eso (excepto mostrar lo que se le dice que muestre).

Y solo puede haber una sesión por proceso y por dispositivo terminal. Una sesión puede tener un terminal de control adjunto, pero no es obligatorio (todas las sesiones comienzan sin un terminal hasta que abren uno). xterm , en el proceso en el que se bifurca para ejecutar su shell, por lo general se crea una nueva sesión (y, por lo tanto, se desconecta de la terminal donde inició xterm desde si existe), abra el nuevo /dev/pts/x ha generado, al conectar ese dispositivo terminal a la nueva sesión. Luego ejecutará su shell en ese proceso, por lo que su shell se convertirá en el líder de la sesión. Su shell o cualquier shell interactivo en esa sesión normalmente hará malabarismos con los grupos de procesos y tcsetpgrp() , para configurar los trabajos en primer plano y en segundo plano para ese terminal.

En cuanto a qué información almacena un dispositivo terminal con disciplina tty (serial o pty) , eso suele ser lo que stty el comando muestra y modifica. Toda la configuración de la disciplina:tamaño de la pantalla del terminal, local, banderas de entrada y salida, configuración de caracteres especiales (como ^C, ^Z...), velocidad de entrada y salida (no relevante para ptys). Eso corresponde a tcgetattr() /tcsetattr() funciones que en Linux se asignan a TCGETS /TCSETS ioctls y TIOCGWINSZ /TIOCSWINSZ por el tamaño de la pantalla. Puede argumentar que el grupo de procesos de primer plano actual es otra información almacenada en el dispositivo terminal (tcsetpgrp() /tcgetpgrp() , TIOC{G,S}PGRP ioctls), o el búfer de entrada o salida actual.

Tenga en cuenta que la información del tamaño de la pantalla almacenada en el dispositivo terminal puede no reflejar la realidad. El emulador de terminal generalmente lo configurará (a través del mismo ioctl en el tamaño maestro) cuando se cambie el tamaño de su ventana, pero puede perder la sincronización si una aplicación llama al ioctl en el lado esclavo o cuando el cambio de tamaño no se transmite (en caso de que de una conexión ssh que implica otro pty generado por sshd si ssh ignora el SIGWINCH por ejemplo). También se puede consultar el tamaño de algunos terminales a través de secuencias de escape, por lo que una aplicación puede consultarlo de esa manera y actualizar la disciplina de línea con esa información.

Relacionado:Debian:¿el efecto de establecer un bit inmutable en la partición /boot?

Para más detalles, puedes echar un vistazo a los termios y tty_ioctl páginas man en Debian, por ejemplo.

Para jugar con otras disciplinas de línea:

  1. Emular un mouse con un pseudo-terminal:

    socat pty,link=mouse fifo:fifosudo inputattach -msc mouse # establece la disciplina de la línea MOUSE y especifica protocolxinput list # ver el nuevo mouse thereexec 3<> fifoprintf '20712
    
Linux
  1. Use la terminal de Linux para ver qué archivos hay en su computadora

  2. ¿Qué son los separadores de palabras de Readline?

  3. ¿Contar los caracteres de cada línea con Wc?

  4. ¿Cuáles son los beneficios de CloudLinux?

  5. ¿Cómo funcionan los pseudo-terminales *nix? ¿Cuál es el canal maestro/esclavo?

Domina la línea de comandos de Linux

DevOps vs Ingeniero de software:¿Cuál es la diferencia?

useradd vs adduser:¿Cuáles son las diferencias?

¿Qué son los pseudo terminales (pty/tty)?

¿Qué es la utilidad de línea de comandos de DNS inversa?

¿Cuáles son los beneficios del Administrador de volúmenes lógicos?