¿Cómo se envía la información del terminal (como el tamaño de la ventana) a un programa de Linux?

¿Cómo se envía la información del terminal (como el tamaño de la ventana) a un programa de Linux?

Todo lo que sé es que un proceso tiene el descriptor de archivo 0/1 configurado en stdin/stdout de forma predeterminada. Pero, ¿cómo saben programas como vi sobre el tamaño de la ventana, especialmente cuando puedo cambiar el tamaño de la ventana libremente en el entorno de escritorio? No puedo pensar en cómo esto podría enviarse a través de señales, así que supongo que existen otros mecanismos.

No sé nada sobre el emulador de terminal, lo que supongo podría estar relacionado con la pregunta. Cualquier sugerencia será útil y apreciada.

Respuesta1

El tamaño de una terminal se mantiene en la estructura interna del kernel y puede ser consultado TIOCGWINSZy configurado por TIOCSWINSZioctls. Consulte la ioctl_tty(2)página de manual para obtener más detalles.

Cada vez que se establece el tamaño de la ventana TIOCSWINSZ(por ejemplo, xtermcuando se cambió el tamaño de la ventana GUI), el kernel enviará una SIGWINCHseñal algrupo de procesos de primer planode esa terminal.

Un programa como vicapta esa señal y actualiza su idea del tamaño de la ventana a través de TIOCGWINSZ.

El tamaño de la ventana generalmente lo establece el programa que controla el extremo maestro de un pseudo-tty (como xtermo sshd), pero cualquier proceso capaz de abrir el tty (ya sea en modo de solo lectura o de solo escritura) puede hacerlo.

Una interfaz de línea de comando para esos ioctls se realiza a través del sttyprograma. (p.ej. stty cols 80 rows 40). Esto es útil con terminales serie reales, que no tienen un tamaño inherente ni una forma estándar de transmitir esa información.


Aunque aún no está estandarizado[1], todo esto no es específico de Linux y funciona de manera similar en otros sistemas como BSD o Solaris. Una diferencia notable es que unfondoEl proceso que intenta cambiar el tamaño de su tty controlador TIOCSWINSZobtendrá una SIGTTOUseñal en BSD y Solaris, pero no en Linux.

En cualquiera de esos sistemas, unfondoEl proceso NO recibirá una SIGWINCHseñal, ni cuando se cambie el tamaño de su tty controlador, ni cuando se convierta en un proceso de primer plano. Los programas de pantalla completa asumen que se están ejecutando en primer plano o detenidos, y también consultan el tamaño del terminal ante una SIGCONTseñal (junto con otras operaciones tty como cambiar a la pantalla alternativa o desactivar el modo canónico).

Observe que un proceso no necesita tener un identificador abierto para un tty para que sea su tty controlador, y puede tener un identificador abierto para un tty sin que sea su tty controlador.

No hay otra forma de notificar a un proceso sobre los cambios en el tamaño del terminal que no sea estar en el grupo de procesos de primer plano del tty. Además, no existe una forma general de recibir notificaciones sobreotrocambios en los parámetros del terminal: tcsetattr(3)no generará ninguna señal o evento que pueda ser select(2)editado.

[1]Está previsto incluir una interfaz estándar en una próxima versión de POSIX, con las funciones tcgetwinsizey tcsetwinsize, fácilmente implementables como contenedores para ioctl(TIOC[SG]WINSZ). Veraquípara detalles.

información relacionada