He estado buscando una forma de obtener el ancho de la terminal desde mi programa C. Lo que se me ocurre es algo parecido a:
#include <sys/ioctl.h>
#include <stdio.h>
int main (void)
{
struct ttysize ts;
ioctl(0, TIOCGSIZE, &ts);
printf ("lines %d\n", ts.ts_lines);
printf ("columns %d\n", ts.ts_cols);
}
Pero cada vez que lo intento consigo
austin@:~$ gcc test.c -o test
test.c: In function ‘main’:
test.c:6: error: storage size of ‘ts’ isn’t known
test.c:7: error: ‘TIOCGSIZE’ undeclared (first use in this function)
test.c:7: error: (Each undeclared identifier is reported only once
test.c:7: error: for each function it appears in.)
¿Es esta la mejor manera de hacer esto o hay una mejor manera? Si no, ¿cómo puedo hacer que esto funcione?
EDITAR: el código fijo es
#include <sys/ioctl.h>
#include <stdio.h>
int main (void)
{
struct winsize w;
ioctl(0, TIOCGWINSZ, &w);
printf ("lines %d\n", w.ws_row);
printf ("columns %d\n", w.ws_col);
return 0;
}
Respuestas:
¿Ha considerado usar getenv () ? Le permite obtener las variables de entorno del sistema que contienen las columnas y líneas de los terminales.
Alternativamente, usando su método, si desea ver lo que el kernel ve como el tamaño de la terminal (mejor en caso de que se cambie el tamaño de la terminal), necesitaría usar TIOCGWINSZ, en lugar de su TIOCGSIZE, así:
y el código completo:
fuente
ws_xpixel
yws_ypixel
, ¡pero solo imprime ceros!Este ejemplo es un poco extenso, pero creo que es la forma más portátil de detectar las dimensiones del terminal. Esto también maneja eventos de cambio de tamaño.
Como sugieren tim y rlbond, estoy usando ncurses. Garantiza una gran mejora en la compatibilidad del terminal en comparación con la lectura directa de variables de entorno.
fuente
man 7 signal
OK
yERR
. Qué "amables" de ellos para ayudarnos a llenar ese vacío en nuestras vidas :-(Necesita ser compilado
-ltermcap
. Hay mucha otra información útil que puede obtener usando termcap. Consulte el manual de termcap utilizandoinfo termcap
para obtener más detalles.fuente
Si tiene ncurses instalado y lo está usando, puede usar
getmaxyx()
para encontrar las dimensiones del terminal.fuente
Suponiendo que está en Linux, creo que desea usar la biblioteca ncurses en su lugar. Estoy bastante seguro de que las cosas ttysize que tienes no están en stdlib.
fuente
ioctl
forma es más simple y limpia, porque no tienes que inicializar maldiciones, etc.Así que no sugiero una respuesta aquí, pero:
linux-pc:~/scratch$ echo $LINES
49
linux-pc:~/scratch$ printenv | grep LINES
linux-pc:~/scratch$
Ok, y noto que si cambio el tamaño del terminal GNOME, las variables LINES y COLUMNS siguen a eso.
¿Parece que el terminal GNOME está creando estas variables de entorno por sí mismo?
fuente
Para agregar una respuesta más completa, lo que encontré que me funciona es usar la solución de @ John_T con algunos bits agregados de Rosetta Code , junto con algunos problemas de resolución de dependencias. Puede ser un poco ineficiente, pero con la programación inteligente puede hacer que funcione y no tener que abrir el archivo de su terminal todo el tiempo.
Si se asegura de no llamarlo todo, pero tal vez de vez en cuando debería estar bien, incluso debería actualizarse cuando el usuario cambie el tamaño de la ventana del terminal (porque está abriendo el archivo y leyéndolo todo el tiempo).
Si no está utilizando,
TIOCGWINSZ
vea la primera respuesta en este formulario https://www.linuxquestions.org/questions/programming-9/get-width-height-of-a-terminal-window-in-c-810739/ .Ah, y no te olvides
free()
delresult
.fuente
Aquí están las llamadas de función para la variable ambiental ya sugerida:
fuente
SIGWINCH
señal, de modo que puedan mantener las variables actualizadas (también lo necesitan para que realicen un ajuste de línea adecuado en el editor de entrada).getenv()
devuelve NULL o no y lo hace en mi terminal de Linux (porque esas variables no se exportan). Además, incluso si el shell actualiza esas variables, no verá el cambia mientras su programa se está ejecutando (no sin que usted tenga su propioSIGWINCH
controlador).