Terminal Eigenschaften



  • Hallo Forum!

    Folgendes Problem:
    Ich möchte die Spalten (und Zeilen) des aktuellen Terminals ('echte' Konsole, SuSE 8.0) ermitteln, ohne Curses zu benutzen.

    Allerdings habe ich noch keine Mehtode herausgefunden, dies zuverlässig zu tun.

    1. getenv("COLUMNS")

    - klappt wunderbar, solange $COLUMNS auch exportiert wurde

    2. terminfo selber auslesen.

    - komische sache dieses terminfo-ding: zwar habe ich mittels
    "man 5 term" eine Auslesefunktion hinbekommen, jedoch fehlt genau
    für das terminal 'linux' der Eintrag für die Spalten?! ... okay nächste
    Methode

    struct winsize ws;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);

    - diese Methode habe ich im Quelltext von stty (welches aus irgendwelchen
    Gründen ja die richtigen Zeilen und Spalten ausgibt) gefunden. Allerdings
    wird die winsize-Struktur bei dem ioctl-Aufruf nicht 'besetzt' (ohne, dass
    ein Fehler gemeldet wird).

    Also, falls mir hier jemand weiterhelfen kann, wäre ich ziemlich dankbar (auch
    Links, die das Verständnis dieser Problematik erhellen könnten sind gerne gesehen 😉

    Gruss,
    FB



  • Letzte Variante sollte funktionieren, tut sie jedenfalls hier. Versuchs mal mit STDIN_FILENO (0). So hab ich's bisher jedenfalls überall gesehen.



  • Okay, Butter bei die Fisch' 😉

    Also an diesem Code ist alles okay (nur um auszuschießen, dass ich einen ganz blöden Fehler gemacht habe)?

    #include <stdio.h>
    #include <sys/ioctl.h>
    #include <unistd.h>
    #include <string.h>
    
    int get_cols();
    
    int main(int argc, char **argv)
    {
      printf("Cols: %d\n", get_cols());
      return 0;
    }
    
    int get_cols()
    {
      int fd = STDOUT_FILENO;
      struct winsize ws;
    
      memset(&ws, 0, sizeof(ws));
    
      if ( ioctl(fd, TIOCSWINSZ, &ws) == -1 ) {
        perror("ioctl:");
        return 0;
      }
    
      return ws.ws_col;
    }
    

    Edit: Es ist auch egal, ob der FD stdin, stdout oder ein wahnsinnig umständlich ermittelter FD des Terminals ist ...



  • Nicht, TIOCSWINSZ, sondern TIOCGWINSZ.. Dann funktioniert dein Beispiel hier.



  • Autsch! Der tat weh - jetzt klappt's auch hier 😉

    Danke 🙂


Anmelden zum Antworten