Wie werden Terminalinformationen (z. B. Fenstergröße) an ein Linux-Programm gesendet?

Wie werden Terminalinformationen (z. B. Fenstergröße) an ein Linux-Programm gesendet?

Ich weiß nur, dass ein Prozess den Dateideskriptor 0/1 standardmäßig auf stdin/stdout eingestellt hat. Aber woher wissen Programme wie vi etwas über die Fenstergröße, insbesondere wenn ich die Fenstergröße in der Desktopumgebung frei ändern kann? Ich kann mir nicht vorstellen, wie dies über Signale gesendet werden könnte, also nehme ich an, dass es andere Mechanismen gibt?

Ich weiß nichts über Terminalemulatoren, was vermutlich mit der Frage zusammenhängt. Jeder Hinweis ist hilfreich und willkommen.

Antwort1

Die Größe eines Terminals wird in einer kernelinternen Struktur gespeichert und kann von ioctls abgefragt TIOCGWINSZund festgelegt werden TIOCSWINSZ. ioctl_tty(2)Weitere Informationen finden Sie auf der Manpage.

Jedes Mal, wenn die Fenstergröße geändert wird TIOCSWINSZ(z. B. xtermwenn das GUI-Fenster in der Größe geändert wurde), sendet der Kernel ein SIGWINCHSignal an denVordergrund-Prozessgruppedieses Terminals.

Ein Programm wie vifängt dieses Signal ab und aktualisiert seine Vorstellung der Fenstergröße über TIOCGWINSZ.

Die Fenstergröße wird normalerweise durch das Programm festgelegt, das das Masterende eines Pseudo-TTY steuert (wie xtermoder sshd), aber jeder Prozess, der das TTY öffnen kann (ob im Nur-Lese- oder Nur-Schreib-Modus), kann dies tun.

Eine Befehlszeilenschnittstelle zu diesen Ioctls erfolgt über das sttyProgramm. (z. B. stty cols 80 rows 40). Dies ist bei echten seriellen Terminals nützlich, die keine inhärente Größe und keine Standardmethode zum Übermitteln dieser Informationen haben.


Obwohl noch nicht standardisiert[1], all dies ist nicht Linux-spezifisch und funktioniert ähnlich auf anderen Systemen wie BSD oder Solaris. Ein bemerkenswerter Unterschied ist, dass einHintergrundEin Prozess, der versucht, die Größe seines steuernden TTY zu ändern, TIOCSWINSZerhält SIGTTOUunter BSD und Solaris ein Signal, unter Linux jedoch nicht.

Auf jedem dieser SystemeHintergrundDer Prozess erhält KEIN SIGWINCHSignal, weder wenn die Größe seines steuernden TTY geändert wird, noch wenn er zu einem Vordergrundprozess wird. Vollbildprogramme gehen davon aus, dass sie entweder im Vordergrund laufen oder gestoppt sind, und fragen bei einem SIGCONTSignal auch die Terminalgröße ab (zusammen mit anderen TTY-Operationen wie dem Umschalten auf den alternativen Bildschirm oder dem Ausschalten des kanonischen Modus).

Beachten Sie, dass ein Prozess keinen offenen Handle zu einem TTY haben muss, um sein steuerndes TTY zu sein, und dass er einen offenen Handle zu einem TTY haben kann, ohne dass es sein steuerndes TTY ist.

Es gibt keine andere Möglichkeit, einen Prozess über Änderungen der Terminalgröße zu informieren, als sich in der Vordergrundprozessgruppe des TTYs zu befinden. Außerdem gibt es keine allgemeine Möglichkeit, über Änderungen informiert zu werden.andereÄnderungen an den Terminalparametern: tcsetattr(3)Es wird kein Signal oder Ereignis generiert, select(2)auf das reagiert werden kann.

[1]In einer kommenden Version von POSIX soll eine Standardschnittstelle enthalten sein, mit den Funktionen tcgetwinsizeund tcsetwinsize, die leicht als Wrapper für implementiert werden können ioctl(TIOC[SG]WINSZ). SieheHierfür Details.

verwandte Informationen