%3F.png)
Angenommen, der ping
Befehl wird ausgeführt und ich gebe etwas in das Terminal ein, während ping
er noch ausgeführt wird.
Wenn ich jetzt ping
ende und bash
die Kontrolle zurückerhalte, bash
drucke ich auf dem Terminal aus, was ich während ping
der Ausführung eingegeben habe. Dies ist ein Screenshot, der zeigt, was ich meine:
Wie habe ich bash
diese Informationen erhalten? Ich bin sicher, dass ich sie nicht von erhalten habe stdin
, denn als ich eingegeben habe "I typed this while ping was running"
, habe ich nicht gedrückt Enter(und stdin
ist daher leer).
Antwort1
SchlagtatHolen Sie sich Ihre Eingabe von der Standardeingabe (stdin), also dem Terminal.
Ein Terminal kann sich in einem von zweiModi:rohodergekocht(auch bekannt als „Zeichenmodus“ und „Zeilenmodus“, die Begriffe „raw“ und „cooked“ werden hauptsächlich in der Unix-Welt verwendet) (das Wort „cooked“ wurde als Wortspiel eingeführt, um das Gegenteil von „raw“ zu bilden). Im Raw-Modus überträgt das Terminal die Eingabe sofort an die Anwendung. Im Cooked-Modus liest das Terminal eine vollständige Zeile und bietet einen (sehr primitiven) Zeilenbearbeitungsmechanismus und überträgt die Daten nur dann an die Anwendung, wenn der Benutzer drückt Enter.
Terminals starten im Cooked-Modus. Anwendungen, die mehr Kontrolle über die Eingabe benötigen, wie z. B. Bash, versetzen das Terminal in den Raw-Modus, während sie darauf warten, dass der Benutzer einen Befehl eingibt.
Antwort2
Ich glaube, das Terminal puffert jede über die Tastatur empfangene Textzeile, sodass jedes Programm, das einen Dateideskriptor (z. B. fd0) an die Gerätedatei des Terminals angehängt hat, keinen Text aus der Zeile sieht, bis das Terminal ihn „sendet“ – was passiert, wenn Sie drücken Enter.
(Wie die Zeileneditoren von Shells dies umgehen – ich bin mir nicht sicher, aber sie erreichen den Text auf jeden Fall, bevor Sie drücken Enter.)
Auch wenn eine Shell einen untergeordneten Prozess startet (in diesem Fall ping
), wechselt sie wait
während der Ausführung des untergeordneten Prozesses in den Zustand „suspendiert/beginnend“, sodass die Shell den Text auch dann ignorieren würde, wenn das Terminal ihm keinen Text vorenthalten würde, da sie davon ausgeht, dass er für den untergeordneten Prozess bestimmt ist.
Der Text, den Sie auf dem Bildschirm sehen, ist also, weil dieTerminalzeigt ihn an, aber es gibt kein Programm, das ihn erfasst und irgendetwas damit macht, bis das untergeordnete Element beendet wird – und die Shell „aufwacht“. Dann wird der Text an den Zeileneditor der Shell gesendet. Obwohl ich nicht glaube, dass alle Terminals das unbedingt tun.