Ich habe nach einer Möglichkeit gesucht, die Terminalbreite aus meinem C-Programm heraus zu ermitteln. Was mir immer wieder einfällt, ist etwas in der Art 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 das versuche, bekomme 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, oder gibt es einen besseren Weg? Wenn nicht, wie kann ich das zum Laufen bringen?
EDIT: fester Code 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;
}
Antworten:
Haben Sie überlegt, getenv () zu verwenden ? Hiermit können Sie die Umgebungsvariablen des Systems abrufen, die die Spalten und Zeilen der Terminals enthalten.
Wenn Sie alternativ Ihre Methode verwenden möchten, um zu sehen, was der Kernel als Terminalgröße sieht (besser, wenn die Größe des Terminals geändert wird), müssen Sie TIOCGWINSZ im Gegensatz zu Ihrer TIOCGSIZE verwenden, wie folgt:
und der vollständige Code:
quelle
ws_xpixel
und verwendetws_ypixel
, aber es werden nur Nullen gedruckt!Dieses Beispiel ist etwas langwierig, aber ich glaube, es ist die tragbarste Methode zum Erkennen der Terminalabmessungen. Dies behandelt auch Größenänderungsereignisse.
Wie tim und rlbond vorschlagen, benutze ich ncurses. Es garantiert eine große Verbesserung der Terminalkompatibilität im Vergleich zum direkten Lesen von Umgebungsvariablen.
quelle
man 7 signal
OK
undERR
. Wie "nett" von ihnen, uns zu helfen, diese Lücke in unserem Leben zu schließen :-(Muss kompiliert werden mit
-ltermcap
. Es gibt viele andere nützliche Informationen, die Sie mit termcap erhalten können.info termcap
Weitere Informationen finden Sie im termcap-Handbuch unter .quelle
Wenn Sie ncurses installiert haben und verwenden, können
getmaxyx()
Sie die Abmessungen des Terminals ermitteln.quelle
Angenommen, Sie arbeiten unter Linux, möchten Sie stattdessen die ncurses- Bibliothek verwenden. Ich bin mir ziemlich sicher, dass das ttysize-Zeug, das Sie haben, nicht in stdlib ist.
quelle
ioctl
Weg ist einfacher und sauberer, da Sie keine Flüche usw. initialisieren müssenSchlagen Sie hier also keine Antwort vor, sondern:
linux-pc:~/scratch$ echo $LINES
49
linux-pc:~/scratch$ printenv | grep LINES
linux-pc:~/scratch$
Ok, und ich stelle fest, dass die Variablen LINES und COLUMNS dem folgen, wenn ich die Größe des GNOME-Terminals verändere.
Irgendwie scheint das GNOME-Terminal diese Umgebungsvariablen selbst zu erstellen?
quelle
Um eine vollständigere Antwort hinzuzufügen, habe ich festgestellt, dass die Lösung von @ John_T mit einigen aus Rosetta Code hinzugefügten Bits zusammen mit einigen Fehlern bei der Ermittlung von Abhängigkeiten funktioniert . Es mag ein bisschen ineffizient sein, aber mit intelligenter Programmierung können Sie es zum Laufen bringen und Ihre Terminaldatei nicht ständig öffnen.
Wenn Sie sicherstellen, dass Sie nicht alles aufrufen, aber vielleicht hin und wieder, sollte es Ihnen gut gehen, sollte es sogar aktualisiert werden, wenn der Benutzer die Größe des Terminalfensters ändert (weil Sie die Datei jedes Mal öffnen und lesen ).
Wenn Sie nicht verwenden,
TIOCGWINSZ
lesen Sie die erste Antwort auf diesem Formular https://www.linuxquestions.org/questions/programming-9/get-width-height-of-a-terminal-window-in-c-810739/ .Oh, und vergiss
free()
das nichtresult
.quelle
Hier sind die Funktionsaufrufe für die bereits vorgeschlagene Umgebungsvariable:
quelle
SIGWINCH
Signal ein, damit sie die Variablen auf dem neuesten Stand halten können (sie benötigen ihn auch, damit sie den richtigen Zeilenumbruch im Eingabeditor ausführen).getenv()
NULL zurückgegeben wird oder nicht, und dies in meinem Linux-Terminal (da diese Variablen nicht exportiert werden). Auch wenn die Shell diese Variablen aktualisiert, wird das nicht angezeigt Änderungen, während Ihr Programm ausgeführt wird (nicht ohne dass Sie einen eigenenSIGWINCH
Handler haben).