Angenommen, ich renne cmd.exe und ping localhost. Danach ping ich wieder localhost, aber ich klicke in das Fenster und der Ping stoppt, bis ich drücke eingeben .
Was passiert genau, wenn ich in das Fenster klicke? Unterbricht es den Prozess oder etwas anderes? Ich habe einen Screenshot angehängt, um dieses Problem zu klären.
Hinweis: Ich klicke nicht wirklich, sondern ziehe mit der Maus, wodurch ein weißes Feld im Fenster erstellt wird, wie auf dem Screenshot zu sehen ist.
Edit: weitere Klarstellung: Was ich wirklich wissen möchte, ist, ob das Ziehen des Fensters den Cmd-Prozess stoppt oder nicht?
Edit: noch mehr Klarheit: Ich weiß, dass ich Quick Edit verwende und durch Drücken von enter den ausgewählten Inhalt kopiert. Was ich nicht weiß ist, was im Hintergrund passiert.
quelle
Antworten:
Wenn Sie im cmd.exe-Fenster Text auswählen, wird der Prozess im Hintergrund fortgesetzt, bis er das nächste Mal in die Standardausgabe (oder STDOUT, den Datenstrom, der im cmd.exe-Fenster angezeigt wird) schreibt.
Wenn Sie den Auswahlmodus verlassen, wird der Vorgang normal fortgesetzt.
Sie können dies durch Eingabe testen
ping www.google.com -t
in Ihrem cmd.exe-Fenster und wählen Sie einen Bereich der Ausgabe aus. Sie werden sehen, dass es pausiert und wenn Sie die Auswahl aufheben, wird die Ausgabe fortgesetzt.Bearbeiten: Laut Frans Kommentar können Sie ein Werkzeug wie Wireshark verwenden, um zu sehen, dass die Aktivität nach dem Punkt, an dem Sie die Auswahl getroffen haben, immer noch stattfindet und dann stoppt.
quelle
write()
aber es bleibt hängen.Sobald Sie in das Eingabeaufforderungsfenster klicken, lässt der Konsolenhost keine Ausgabe mehr zu. Die Anwendung selbst läuft weiter, aber es wird nichts auf den Bildschirm geschrieben.
Solange es nur einen einzigen Thread gibt, ist dies im Grunde das Gleiche wie ein eingefrorener Prozess. Da der einzelne Thread versucht, etwas zu schreiben, bevor er mehr Arbeit erledigt.
Wenn ich renne
ping -t localhost
Wenn Sie in das Eingabeaufforderungsfenster klicken, kann ich den Aufrufstapel des Main überprüfenping.exe
fädeln mit Process Explorer .Wir können das sehen
ping.exe
versuchte etwas Ausgabe zu schreiben. Es hat gerufenwrite()
in der C-Laufzeitbibliothek. Diese Funktion ruft irgendwann mal auf GetConsoleMode . Wie es scheint, überprüft diese Funktion, ob sich der Benutzer aktuell im Markierungsmodus befindet, und blockiert die Ausführung, falls erforderlich.Weitere Analyse
Wir können dieses Verhalten weiter beweisen, indem wir das Verhalten von untersuchen
ping
mit WiresharkBeim Laufen
ping -t superuser.com
In Wireshark sehen wir folgende Ausgabe:Lassen Sie uns nun ein Feld in der Eingabeaufforderung markieren.
Plötzlich werden keine Pings mehr in Wireshark angemeldet.
ping
sendet keine Pakete mehr.Aber das wussten wir schon ...
Richtig, mal sehen, ob die Ausgabe ist tatsächlich das Problem hier! Lassen Sie uns die Ausgabe auf die
NUL
Gerät:Jetzt gibt es keine Ausgabe mehr. Wir können jetzt den ganzen Tag Text in der Box markieren, Pakete werden in Wireshark protokolliert.
quelle
Dies liegt daran, dass das Fenster den Markierungsmodus aktiviert hat. Wenn Sie die Eingabetaste drücken, wird der ausgewählte Text in die Zwischenablage kopiert. Meines Wissens gibt es dafür keine Einstellung. Ich bin mir also nicht sicher, warum das so ist, wenn Sie einfach in das Fenster klicken. Normalerweise müssen Sie mit der rechten Maustaste klicken und "Mark" drücken. Stellen Sie sicher, dass keine Tasten auf Ihrer Tastatur stecken.
quelle
Ihr CMD-Fenster befindet sich im Schnellbearbeitungsmodus, der beim Klicken auf den Bildschirm automatisch in den Bearbeitungsmodus wechselt. Die Eingabe dient zum Kopieren des Textes in das weiße Feld und zum Verlassen des Bearbeitungsmodus.
Normalerweise wechselt CMD nur in den Bearbeitungsmodus, wenn Sie mit der rechten Maustaste auf den schwarzen Bildschirm klicken und "Markieren" wählen.
Um zum Normalzustand zurückzukehren, klicken Sie mit der rechten Maustaste auf die Titelleiste der Fenster, wählen Sie Eigenschaften, wählen Sie die Registerkarte Optionen, und deaktivieren Sie "Quick Edit Mode", und klicken Sie auf OK.
quelle
Wenn Sie den zu kopierenden Text aus dem Fenster auswählen (wenn in
Mark
Modus) Das System setzt den aktuellen Prozess in diesem Fenster aus.Beispiel Batchdatei:
Wenn dies ausgeführt wird, hört der Bildschirm auf zu blättern, sobald ich den zu kopierenden Bereich markiere
quelle
echo blah↵%0
).:-)
Wie jeder so nett darauf hingewiesen hat, wird der Fortschritt der zusätzlichen Ausgabe während eines Markierungsvorgangs blockiert. Sie können den Markierungsmodus auch mit dem alternativen Mausklick (standardmäßig Rechtsklick) oder durch Drücken der Eingabetaste auf Ihrer Tastatur verlassen und die markierte Auswahl in den Einfügepuffer von Windows kopieren. Es gibt einen anderen Ausweg, nämlich die Esc-Taste zu drücken, um das Markieren eines Bildschirmbereichs aufzuheben und den Block bei der Ausgabe zu lösen. Dies setzt voraus, dass Sie den QuickEdit-Modus in den Eigenschaften dieses Befehlsfensters ausgewählt haben. Sie können in diese Situation auch bewusster einsteigen, indem Sie dem Befehlsfenster mitteilen, dass Sie Text auswählen möchten.
quelle
Zur weiteren Bestätigung der Aussage, dass der Prozess im "Markierungsmodus" anhält, z. Während eines Mausklicks oder Ziehens innerhalb der cmd.exe-Fensterränder, stoppt jede Operation jedoch erst, wenn die laufende Instanz vollständig abgeschlossen ist. Ich biete einen indirekten Beweis an:
Sie sehen den Protokollierungsstream einer Visual Studio-Installation, in dem das Befehlszeilenprogramm von Visual Studio Setup alle installierten Workloads überprüft.
Um 13:26:26 habe ich auf das Eingabeaufforderungsfenster geklickt. Die Ausgabe auf dem Bildschirm bleibt bis 14:09:03 stehen, wenn ich die Eingabetaste gedrückt habe, um den Markierungsmodus zu beenden.
Beachten Sie nun, dass nach 13:26:26 der Prozess beendet wird, um den Hash x86-23_r20.zip zu überprüfen. gelungen Hash: X "und mit einer anderen Datei um 14:09:03 Uhr die Nachricht neu starten" BEGIN: Überprüfen " [..] AndroidSDKPrivateInstall.ps1 "
Während der Pause beendete das Visual Studio-Befehlszeilen-Dienstprogramm die Überprüfung der verarbeiteten Datei, und genau zu dem Zeitpunkt, als das Steuerelement an die Konsole zurückgegeben werden sollte, begann eine neue Hash-Prüfarbeit.
quelle