¿Cómo sabe menos la resolución del terminal?

¿Cómo sabe menos la resolución del terminal?

Cada vez que alguien establece un tamaño diferente para una consola virtual, lessreconoce la resolución de la ventana (supongo que...); de acuerdo con eso, cambia cuántas líneas de texto debe visualizar. ¿Cómo se calcula ese parámetro?

Respuesta1

Si está buscando una manera de verificar desde un script, puede hacer cualquiera de estas cosas:

  • Ejecutar tput colsy tput lines, como sugiere manatwork
  • comprobar los valores de $LINES y $COLUMNS

Pero si quieres los detalles, allá vamos:

Para terminales virtuales (xterm, et al) hay una ioctl()llamada al sistema que le indicará el tamaño de la ventana. Si puede, lessutiliza esta llamada. Además, cuando cambia el tamaño de la ventana, lo que sea que se esté ejecutando en esa ventana recibe una SIGWINCHseñal que le lessindica que debe buscar un nuevo tamaño de ventana. Por ejemplo, comencé a lessejecutar (como ID de proceso 16663), me conecté con stracey cambié el tamaño de la ventana. Esto es lo que vi:

$ strace -p 16663
Process 16663 attached - interrupt to quit
read(3, 0xbfb1f10f, 1)                  = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
rt_sigaction(SIGWINCH, {0x805cf10, [WINCH], SA_RESTART}, {0x805cf10, [WINCH], SA_RESTART}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(2, TIOCGWINSZ, {ws_row=40, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0

Esto también es lo que tput colshacen tput linesentre bastidores, si pueden. Para obtener más información sobre este método, consulte man tty-ioctly busque TIOCGWINSZ.

Sin embargo, para otros terminales, como los conectados a puertos serie, no hay forma de obtener esta información directamente. En ese caso, lessempieza a buscar pistas en las variables de entorno.

  • LINESy COLUMNSa menudo se ajustarán a las dimensiones del terminal. De hecho, si basho zshpuede encontrar las dimensiones del terminal, establecerá automáticamente estas variables para facilitar que los programas no tan inteligentes vean el tamaño del terminal. Sin embargo, la mayoría de los demás shells, incluidos dashy tcsh, no configuran estas variables.
  • TERMnormalmente se establece en el tipo de terminal, en cuyo caso la base de datos terminfo puede contener el tamaño esperado del terminal. Si tput rowsno puede utilizar IOCTL (por ejemplo, si está conectado a través de un puerto serie), recurrirá a los valores registrados aquí. Para un terminal cuyo tamaño puede cambiar, esto es sólo una suposición y es probable que esté equivocado.

Para obtener más información, consulte man tputel comando para controlar el terminal y man terminfopara obtener una lista de cosas que puede decirle al terminal que haga.

Respuesta2

Si echas un vistazo al código fuente, conocerás lesslas llamadas ioctl()para recuperar el tamaño de la ventana en Linux.

#ifdef TIOCGWINSZ
    {
        struct winsize w;
        if (ioctl(2, TIOCGWINSZ, &w) == 0)
        {
            if (w.ws_row > 0)
                sys_height = w.ws_row;
            if (w.ws_col > 0)
                sys_width = w.ws_col;
        }
    }
#else
#ifdef WIOCGETD
    {
        struct uwdata w;
        if (ioctl(2, WIOCGETD, &w) == 0)
        {
            if (w.uw_height > 0)
                sys_height = w.uw_height / w.uw_vs;
            if (w.uw_width > 0)
                sys_width = w.uw_width / w.uw_hs;
        }
    }
#endif

Respuesta3

No estoy seguro de si esta es la información que estás buscando. Supongo que lessregistra un controlador de señal para SIGWINCH. Cuando la dimensión del terminal cambia, recibe una SIGWINCHseñal y analiza la información tty para conocer la dimensión actual del terminal. http://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.html

información relacionada