%20a%20un%20programa%20de%20Linux%3F.png)
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 TIOCGWINSZ
y configurado por TIOCSWINSZ
ioctls. 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, xterm
cuando se cambió el tamaño de la ventana GUI), el kernel enviará una SIGWINCH
señal algrupo de procesos de primer planode esa terminal.
Un programa como vi
capta 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 xterm
o 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 stty
programa. (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 TIOCSWINSZ
obtendrá una SIGTTOU
señal en BSD y Solaris, pero no en Linux.
En cualquiera de esos sistemas, unfondoEl proceso NO recibirá una SIGWINCH
señ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 SIGCONT
señ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 tcgetwinsize
y tcsetwinsize
, fácilmente implementables como contenedores para ioctl(TIOC[SG]WINSZ)
. Veraquípara detalles.