Dieses Beispiel ist etwas langatmig, aber ich glaube, es ist die portabelste Art, die Terminalabmessungen zu erkennen. Dies behandelt auch Größenänderungsereignisse.
Wie tim und rlbond andeuten, verwende ich ncurses. Es garantiert eine große Verbesserung der Terminalkompatibilität im Vergleich zum direkten Lesen von Umgebungsvariablen.
#include <ncurses.h>
#include <string.h>
#include <signal.h>
// SIGWINCH is called when the window is resized.
void handle_winch(int sig){
signal(SIGWINCH, SIG_IGN);
// Reinitialize the window to update data structures.
endwin();
initscr();
refresh();
clear();
char tmp[128];
sprintf(tmp, "%dx%d", COLS, LINES);
// Approximate the center
int x = COLS / 2 - strlen(tmp) / 2;
int y = LINES / 2 - 1;
mvaddstr(y, x, tmp);
refresh();
signal(SIGWINCH, handle_winch);
}
int main(int argc, char *argv[]){
initscr();
// COLS/LINES are now set
signal(SIGWINCH, handle_winch);
while(getch() != 27){
/* Nada */
}
endwin();
return(0);
}
Haben Sie darüber nachgedacht, getenv() zu verwenden? Es ermöglicht Ihnen, die Umgebungsvariablen des Systems zu erhalten, die die Spalten und Zeilen der Terminals enthalten.
Wenn Sie alternativ mit Ihrer Methode sehen möchten, was der Kernel als Terminalgröße sieht (besser, falls die Größe des Terminals geändert wird), müssen Sie TIOCGWINSZ verwenden, im Gegensatz zu Ihrer TIOCGSIZE, wie folgt:
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
und der vollständige Code:
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>
int main (int argc, char **argv)
{
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
printf ("lines %d\n", w.ws_row);
printf ("columns %d\n", w.ws_col);
return 0; // make sure your main returns int
}