Wie funktioniert ein Linux-Terminal?

32

Wenn Sie ein Terminal starten und eine ausführbare Datei aufrufen (wobei Sie der Einfachheit halber von einer Zeile ausgehen), erhalten Sie von der ausführbaren Datei eine Antwort auf den Befehl. Wie wird dies für Sie (den Benutzer) gedruckt? Macht das Terminal sowas pexpect? (Umfrage wartet auf Ausgabe) oder was? Wie wird die Ausgabe zum Ausdrucken benachrichtigt? Und wie startet ein Terminal ein Programm? (Ist es ähnlich wie pythons os.fork ()?) Ich bin verwirrt, wie ein Terminal funktioniert, ich habe mit einem Terminal-Emulator gespielt und ich verstehe immer noch nicht, wie all diese Magie funktioniert. Ich schaue auf die Quelle von Konsole (KDE) und Yakuake (verwendet möglicherweise Konsole) und kann nicht verstehen, wo all diese Magie passiert.

Mike
quelle
6
Schauen Sie sich einen einfachen Terminal-Emulator und ein einfaches Spielzeug-Betriebssystem mit einer einfachen Shell an (und die ersten fünfzehn oder mehr Seiten seines Buches). Lesen Sie auch diese Antwort auf eine verwandte Frage.
2
Dieser Link ist auch interessant
@nwildner cool,
Mike
1
Sehen Sie auch, was in / dev / pts-Dateien gespeichert ist und können wir diese öffnen?
Gilles 'SO- hör auf böse zu sein'

Antworten:

30

Ursprünglich hatte man nur blöde Terminals - anfangs tatsächlich Teletypewriters (ähnlich einer elektrischen Schreibmaschine, aber mit einer Papierrolle) (daher / dev / tty - TeleTYpers), aber später Bildschirm + Tastatur-Combos - die gerade einen Schlüsselcode gesendet haben an den Computer gesendet und der Computer hat einen Befehl zurückgesendet, der den Brief auf das Terminal geschrieben hat (dh das Terminal war ohne lokales Echo, der Computer musste das Terminal anweisen, das zu schreiben, was der Benutzer auf dem Terminal eingegeben hat) - dies ist einer der Gründe warum so viele wichtige Unix-Befehle so kurz sind. Die meisten Terminals waren über serielle Leitungen verbunden, aber (mindestens) eines war direkt mit dem Computer verbunden (oft derselbe Raum) - dies war die Konsole. Nur einigen wenigen Benutzern wurde vertraut, dass sie an "der Konsole" arbeiten (dies war häufig das einzige "Terminal", das im Einzelbenutzermodus verfügbar war).

Später gab es auch einige Grafikterminals (sogenannte "xterminals", nicht zu verwechseln mit dem xterm-Programm) mit Bildschirm & Grafikkarte, Tastatur, Maus und einem einfachen Prozessor; die könnte einfach einen X-Server laufen lassen. Sie haben selbst keine Berechnungen durchgeführt, sodass die X-Clients auf dem Computer ausgeführt wurden, mit dem sie verbunden waren. Einige hatten Festplatten, aber sie konnten auch über das Netzwerk booten. Sie waren in den frühen neunziger Jahren beliebt, bevor PCs so billig und leistungsstark wurden.

Ein "Terminal-Emulator" - das "Terminal-Fenster", das Sie mit Programmen wie xtermoder öffnen, konsoleversucht, die Funktionalität solcher dummen Terminals nachzuahmen. Auch Programme wie PuTTY(Windows) emulieren Terminals.

Beim PC, bei dem "die Konsole" (Tastatur + Bildschirm) und "der Computer" eher eine Einheit bilden, gibt es stattdessen "virtuelle Terminals" (unter Linux die Tasten Alt + F1 bis Alt + F6), aber auch diese Imitieren Sie Terminals im alten Stil. Da Unix / Linux immer mehr zu einem Desktop-Betriebssystem wird, das häufig von einem Einzelbenutzer verwendet wird, erledigen Sie den größten Teil Ihrer Arbeit jetzt natürlich "an der Konsole", wo Benutzer zuvor Terminals verwendeten, die über serielle Leitungen verbunden waren.


Es ist natürlich die Shell, die Programme startet. Und es verwendet den Fork-Systemcall (C-Sprache), um eine Kopie von sich selbst mit Umgebungseinstellungen zu erstellen. Dann wird der Exec-Systemcall verwendet, um diese Kopie in den Befehl umzuwandeln, den Sie ausführen möchten. Die Shell wird angehalten (sofern der Befehl nicht im Hintergrund ausgeführt wird), bis der Befehl abgeschlossen ist. Da der Befehl die Einstellungen für stdin, stdout und stderr von der Shell übernimmt, schreibt der Befehl auf den Bildschirm des Terminals und empfängt Eingaben von der Tastatur des Terminals.

Baard Kopperud
quelle
Und zwischen den dummen seriellen Terminals und Xterms gab es en.wikipedia.org/wiki/Blit_(computer_terminal)
sendmoreinfo
31

Wenn Sie ein Terminal öffnen, starten Sie ein Terminal-Emulator-Programm wie xterm, gnome-terminal, lxterm, konsole, ...

Eine der ersten Aufgaben des Terminal-Emulators ist die Zuweisung eines Pseudo-Terminals (oft Pseudo-Tty oder kurz Pty genannt). Der Pty ist ein Paar von Zeichengerätedateien : Der Pty-Master ist die Seite, auf der der Terminalemulator geöffnet ist, und der Pty-Slave ist die Seite, auf der Programme, die im Terminal ausgeführt werden, geöffnet sind. Bei den meisten modernen Geräten ist der Master /dev/ptmx(den jeder Terminal-Emulator geöffnet hat) und der Slave /dev/pts/NUMBER. Der Kerneltreiber für Pseudoterminals verfolgt, welcher Prozess den Master für jedes Slave-Gerät steuert. Der Terminal-Emulator kann den Pfad zum entsprechenden Slave über eine IOCTL auf dem Master-Gerät abrufen .

Sobald der Terminal-Emulator das Master-Gerät geöffnet hat, startet er einen Unterprozess (normalerweise eine Shell, aber es liegt an dem Benutzer, der den Terminal-Emulator aufgerufen hat, um zu entscheiden). Der Emulator führt dies auf die übliche Weise aus, um ein Programm aufzurufen:

  • Gabel ein Kind - Prozess,
  • Öffnen Sie das Slave-Pty-Gerät in den Dateideskriptoren 0, 1 und 2 (Standardeingabe, Standardausgabe und Fehlerstrom).
  • Führen Sie die Shell oder ein anderes Programm im untergeordneten Prozess aus.

Wenn das Kind (oder ein anderer Prozess) in den Pty-Slave schreibt, sieht der Emulator Eingaben auf dem Pty-Master.

Umgekehrt wird der Emulator beim Schreiben auf das Master-Gerät als Eingabe auf dem Slave angesehen.

Expect funktioniert genauso. Der Unterschied zwischen Expect und einem Terminal-Emulator wie xterm besteht darin, wo sie die Eingabe erhalten, die sie in das Programm eingeben (Skript oder Tastatureingabe), und was sie mit der Ausgabe tun (Protokolldatei oder Parser oder Zeichentext in einem Fenster).

Gilles 'SO - hör auf böse zu sein'
quelle
Eines der einfachen Beispiele für das, was hier beschrieben wird, ist die Implementierung des scriptBefehls durch BusyBox , wobei die xgetptyFunktion der Kern der Arbeit mit ist /dev/ptmx.
Ruslan
@Tim Ich weiß zu schätzen, dass Englisch nicht Ihre Muttersprache ist. Aber wenn Sie einen Beitrag bearbeiten, stellen Sie bitte sicher, dass Sie nichts falsch machen. Wenn Sie es nicht verstehen, bearbeiten Sie es nicht. Verwenden Sie bitte auch hier nicht Fett, um Dinge hervorzuheben, die nicht hervorgehoben werden müssen.
Gilles 'SO- hör auf böse zu sein'