
Während des Laufens apt upgrade
habe ich versehentlich ein Ctrl- San dieses Terminalfenster gesendet.
Jetzt weiß ich von XOFF
, XON
, Ctrl- Q, und etwas Neues über Fernschreiber.
Als ich ein Ctrl- Qan das „angehaltene“ Terminal schickte, apt
wurde seine Arbeit fortgesetzt.
Aus der Lektüre über XOFF
ist mir nicht klar, was in passiert ist apt
, oder was generell bei jedem Befehl passiert, der ein empfängt XOFF
. htop
stoppt die Aktualisierung der Anzeige, was gut zu wissen ist, aber htop
läuft immer noch?
Lief es apt
noch? Oder war es apt
praktisch htop
angehalten bzw. eingefroren?
Offensichtlich können die Prozesse während XOFF
des Ausführens noch Eingaben empfangen und werden daher weiterhin ausgeführt.
Was passiert? Beispielsweise hört der Programmzähler offensichtlich nicht einfach auf, den Programmzähler hochzuzählen, sondern friert das Programm ein.
Hängt es davon ab, wie der Befehl zum Umgang mit XOFF programmiert ist? Gibt es ein allgemeines Verhalten, das bei den grundlegenden Linux-Befehlen zu erwarten ist?
NotizDasDasund ähnliche Fragen enthalten keine Antworten auf meine Frage, da sie nicht erwähnen, was im Programm selbst passiert. Ich weiß beispielsweise nicht, ob es apt
stillschweigend weiterlief oder ob es eingefroren/angehalten war.
Antwort1
Wie Sie vielleicht bereits wissen, sind XON
und XOFF
, die standardmäßig an Ctrl+ Sund Ctrl+ gebunden sind,QSoftware-FlusskontrolleCharaktere und im Prinzip Relikte aus deralte Zeiten der papierdruckenden Fernschreiber. Sie wurden zu Zeiten verwendet, in denen ein Empfangsgerät (oft ein Papierdrucker) manchmal nicht mit den von einem Remote-Absender gesendeten Eingaben Schritt halten konnte.
Heutzutage werden Papierfernschreiber nicht mehr verwendet, aber die Idee dahinter bleibt im Software-Rahmen eines "Terminals" erhalten (siehe z. B.HierUnddieser sehr schöne Artikel über die Geschichte des TTY), das einige der Konzepte der ursprünglichen papierbasierten Terminals übernommen hat und noch immer implementiert – eines davon ist die Fähigkeit, Flusssteuerungszeichen zu interpretieren.
Normalerweise bekommt ein Programm, das „auf der Konsole“ läuft, also mit einem Pseudoterminal verbunden ist, die Zeichen XON
und nicht zu sehen XOFF
, da sie standardmäßig vom Terminal abgefangen werden, wobei das Standardverhalten darin XOFF
besteht, das Drucken der vom Programm empfangenen Ausgabe zu stoppen. Das Programm selbst ist ansonsten nicht betroffen und läuft im Hintergrund weiter, nur die Ausgabe wird nicht an den Benutzer „weitergesendet“, bis XON
erneut ein empfangen wird.
Wenn Sie ein Programm schreiben und diese Eingabezeichen explizit empfangen möchten, können Sie den tcsetattr()
Systemaufruf in Ihrem Programm verwenden, um die Software-Flusskontrolle über das IXOFF
Flag zu deaktivieren (siehehier zB) -nano
macht das, Zum Beispiel.
Antwort2
htop
stoppt die Aktualisierung der Anzeige, was gut zu wissen ist,htop
läuft aber immer noch [nachdem Strg-S eingegeben wurde]?
Ja, absolut. htop
oder ein anderer Befehl wird durch Strg-S NICHT gestoppt oder eingefroren.
Die IXON
Termios-Einstellung funktioniert nicht wie folgt ISIG
. Das Eintippen der Zeichen VSTOP
(Strg-S) oder VSTART
(Strg-Q) sendet KEIN Signal an den im Terminal laufenden Prozess.
Das lässt sich ganz einfach überprüfen: Öffnen Sie zwei Terminals: Geben Sie im ersten
tail -f /tmp/file
und im zweiten
cat > /tmp/file
Geben Sie nun im zweiten Terminal Strg-S ein und tippen Sie dann blind Zeilen ein, gefolgt von der Eingabetaste. Sie werden auf dem Bildschirm im ersten Terminal angezeigt. Wenn cat
es sich stattdessen um eine Shell handelt und es sich um Befehle wie handelt rm ...
, werden diese ausgeführt, ohne dass sie auf dem Bildschirm wiedergegeben werden müssen.
was im Allgemeinen bei jedem Befehl passiert, der ein XOFF empfängt.
Der Befehl „empfängt kein XOFF“. Das wird alles im Terminaltreiber gehandhabt. Aus Sicht der Anwendung passiert nichts. Wenn das Programm weiterhin umfangreiche Ausgaben sendet (oder die ECHO
Termios-Einstellung aktiviert ist – die Standardeinstellung – und weiterhin umfangreiche Eingaben empfängt), wird jeder Schreibvorgang (oder entsprechende Lesevorgang) zum Terminal irgendwann blockiert, bis Strg-Q empfangen wird.