Was genau macht es, wenn ich in das Fenster von cmd klicke?

38

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.

enter image description here

Adam Arold
quelle
2
Übrigens, Sie können über UserVoice abstimmen, um dieses Verhalten zu ändern: wpdev.uservoice.com/forums/…
Carl Walsh
Nett. Ich habe darüber abgestimmt.
Adam Arold
Die Abstimmung führt mich nur zu einer 404-Seite
Kelly Bang

Antworten:

24

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.

JohnL
quelle
2
Das alleine testet es nicht. Sie müssen auch Wireshark ausführen und prüfen, ob die ICMP-Pakete nicht mehr gesendet werden. Wenn ja, haben Sie Recht, dass der Prozess ausgesetzt ist. Wenn nicht, wird der Prozess nicht angehalten und die Ausgabe wird einfach zwischengespeichert (bis die Puffer voll sind, wird sie entweder angehalten oder Daten gehen verloren).
Fran
Ich bin ziemlich sicher, dass @Fran recht hat - erscheint nicht eine ganze Reihe von Ausgaben gleichzeitig, wenn Sie im Auswahlmodus lange genug gewartet haben?
Izkata
1
Das hat mich sehr geärgert, aber ich habe herausgefunden, dass Sie, wenn Sie zu den Eigenschaften der Cmd-Fenster gehen, die Option "Schnellbearbeitungsmodus" deaktivieren können und nicht in den Auswahlmodus wechseln, indem Sie in das Fenster klicken.
Zitrax
2
@Zitrax Ja, so können Sie verhindern, dass dies versehentlich geschieht. Ich kopiere häufig Dinge aus meinem Befehlsfenster, also mache ich das nicht. (naja, eigentlich benutze ich Consolez was hat das Problem nicht)
JohnL
1
Das nennt man " Blockierung "... d. h: die Anwendung ruft an write() aber es bleibt hängen.
Attie
44

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üfen ping.exe fädeln mit Process Explorer .

enter image description here

Wir können das sehen ping.exe versuchte etwas Ausgabe zu schreiben. Es hat gerufen write() 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 Wireshark

Beim Laufen ping -t superuser.com In Wireshark sehen wir folgende Ausgabe:
enter image description here

Lassen Sie uns nun ein Feld in der Eingabeaufforderung markieren.
enter image description here
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:

enter image description here

Jetzt gibt es keine Ausgabe mehr. Wir können jetzt den ganzen Tag Text in der Box markieren, Pakete werden in Wireshark protokolliert.

enter image description here

Der Hochstapler
quelle
Wenn ich für die ursprüngliche Antwort nicht bereits +1 gegeben hätte, würde ich jetzt für die "Weitere Analyse" +1 geben.
JohnL
6

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.

Brandon J. Dusseau
quelle
Und was macht der "Mark-Modus"? Unterbricht es den Prozess?
Adam Arold
Der Markierungsmodus wird zum Kopieren von Text aus dem Befehlsfenster verwendet. AFAIK ist der einzige Einsatz, obwohl ich vermute, dass es noch andere gibt.
Garrett
7
Die Einstellung wird als Schnellbearbeitungsmodus bezeichnet. Klicken Sie auf das Symbol in der oberen linken Ecke, wählen Sie Eigenschaften und wählen Sie den Schnellbearbeitungsmodus auf der Registerkarte Optionen. Soweit ich weiß, wird der Prozess im Hintergrund fortgesetzt, bis er mit der Konsole interagieren muss. Dann wird er blockiert
JohnL
@JohnL Bitte erstelle eine Antwort, denn ich suche nach deinem Kommentar.
Adam Arold
@edem Hinzugefügt eine Antwort :)
JohnL
5

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.

Nam Phung
quelle
3

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:

:test
echo %0
goto test

Wenn dies ausgeführt wird, hört der Bildschirm auf zu blättern, sobald ich den zu kopierenden Bereich markiere

SeanC
quelle
Ich wollte gerade dasselbe posten (außer dass meine Batch-Datei war.) echo blah↵%0 ). :-)
Synetech
1

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.

DDay
quelle
0

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:

[1378:000f][2018-10-08T13:26:20] END: Verifying package "AndroidEmulator,version=26.0.0.2"
[1378:000f][2018-10-08T13:26:20] BEGIN: Verifying package "AndroidImage_ARM_API23,version=20.0.0.3"
[1378:000f][2018-10-08T13:26:20] Verifying package 'AndroidImage_ARM_API23,version=20.0.0.3'
[1378:000c][2018-10-08T13:26:26] SHA256 verification for 'AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip' succeeded. Hash: X
[1378:0025][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\AndroidSDKPrivateInstall.ps1"
[1378:0012][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip"
[1378:0012][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip.
[1378:0012][2018-10-08T14:09:03] Retrying validation for: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip
[1378:000c][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip.

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.

pin8all
quelle