Frage

Ich habe nach einer Möglichkeit suchen, um die Anschlussbreite von innerhalb meines C-Programms zu erhalten. Was ich immer kommen mit etwas entlang der Linien von:

#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);
}

Aber jedes Mal wenn ich versuche, dass ich

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.)

Ist dies der beste Weg, dies zu tun, oder gibt es einen besseren Weg? Wenn nicht, wie kann ich dies funktioniert?

EDIT: Festcode ist

#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;
}
War es hilfreich?

Lösung

Haben Sie darüber nachgedacht, mit getenv () ? Es ermöglicht Ihnen, die Systemumgebungsvariablen zu erhalten, die die Anschlüsse Spalten und Zeilen enthalten.

Alternativ Ihre Methode verwenden, wenn Sie sehen wollen, was der Kernel als Terminal Größe sieht (besser bei Terminal Größe angepasst), müßten Sie TIOCGWINSZ verwenden, wie zu Ihrem TIOCGSIZE Gegensatz, etwa so:

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
}

Andere Tipps

Dieses Beispiel ist ein bisschen auf der langen Seite, aber ich glaube, es ist die tragbare Art und Weise des Anschluss Dimensionen zu erfassen. Dies ist auch für Ereignisse ändern.

Wie tim und rlbond schon sagt, ich bin mit ncurses. Es gewährleistet eine große Verbesserung in der Terminal-Kompatibilität im Vergleich zu Umwelt Lese Variablen direkt.

#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);
}
#include <stdio.h>
#include <stdlib.h>
#include <termcap.h>
#include <error.h>

static char termbuf[2048];

int main(void)
{
    char *termtype = getenv("TERM");

    if (tgetent(termbuf, termtype) < 0) {
        error(EXIT_FAILURE, 0, "Could not access the termcap data base.\n");
    }

    int lines = tgetnum("li");
    int columns = tgetnum("co");
    printf("lines = %d; columns = %d.\n", lines, columns);
    return 0;
}

Anforderungen mit -ltermcap kompiliert werden. Es gibt viele andere nützliche Informationen, die Sie mit termcap erhalten können. Überprüfen Sie die termcap Handbuch mit info termcap für weitere Details.

Wenn Sie ncurses installiert und verwenden es haben, können Sie getmaxyx() verwenden, um die Abmessungen des Terminals zu finden.

Angenommen, Sie auf Linux sind, ich glaube, Sie die ncurses Bibliothek verwenden möchten stattdessen. Ich bin ziemlich sicher, dass die ttysize Sachen, die Sie haben, ist nicht in stdlib.

Also nicht darauf hindeutet, hier eine Antwort, aber:

linux-pc:~/scratch$ echo $LINES

49

linux-pc:~/scratch$ printenv | grep LINES

linux-pc:~/scratch$

Ok, und ich merke, dass wenn ich den GNOME-Terminal die Größe, die Zeilen und Spalten Variablen folgen, dass.

scheint Kinda wie GNOME-Terminal selbst diese Umgebungsvariablen zu schaffen?

Hier sind die Funktionsaufrufe für die bereits vorgeschlagene Umgebungsvariable Sache:

int lines = atoi(getenv("LINES"));
int columns = atoi(getenv("COLUMNS"));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top