Co robi dokładnie, jeśli kliknę w oknie cmd?

45

Załóżmy, że uruchamiam cmd.exe i pinguj localhost. Następnie ponownie pinguję localhost, ale klikam w okno, a ping zatrzymuje się, dopóki nie nacisnę enter .

Co dzieje się dokładnie po kliknięciu w okno? Czy zawiesza proces czy coś innego? Załączam zrzut ekranu, aby wyjaśnić ten problem.

Uwaga: tak naprawdę nie klikam, ale przeciągam za pomocą myszy, która tworzy białe okno w oknie, jak widać na zrzucie ekranu.

Edycja: dalsze wyjaśnienie: Naprawdę chcę wiedzieć, czy przeciąganie okna zatrzymuje proces cmd, czy nie?

Edycja: jeszcze więcej wyjaśnień: Wiem, że korzystam z Szybkiej edycji i naciśnięcie Enter powoduje skopiowanie wybranych treści. Nie wiem, co dzieje się w tle.

wprowadź opis zdjęcia tutaj

Adam Arold
źródło
2
BTW, możesz głosować na UserVoice, aby zmienić to zachowanie: wpdev.uservoice.com/forums/…
Carl Walsh
Miły. Głosowałem nad tym.
Adam Arold
Głosowanie zabiera mnie tylko na stronę 404
Kelly Bang
1
A co ważniejsze, oto jak wyłączyć tę okropną funkcję od stackoverflow.com/a/37578608/463967
Alan Macdonald

Odpowiedzi:

27

Po zaznaczeniu tekstu w oknie cmd.exe proces będzie kontynuowany w tle, aż do następnego zapisu w standardowym wyjściu (lub STDOUT, strumień danych pokazany w oknie cmd.exe).

Po wyjściu z trybu wyboru proces zostanie wznowiony jak zwykle.

Możesz to przetestować, pisząc ping www.google.com -tw oknie cmd.exe i wybierając jakiś obszar wyniku. Zobaczysz, że pauza, a po odznaczeniu wyjście zostanie wznowione.

Edycja: Zgodnie z komentarzem Frana, możesz użyć narzędzia takiego jak Wireshark, aby zobaczyć, że aktywność nadal dzieje się po dokonaniu wyboru, a następnie zatrzymuje się.

JohnL
źródło
3
Samo to nie testuje. Musisz także uruchomić Wireshark i sprawdzić, czy pakiety ICMP przestają być wysyłane. Jeśli tak, masz rację, że proces został zawieszony. Jeśli nie, proces nie jest zawieszany, a dane wyjściowe są po prostu buforowane (dopóki bufory się nie zapełnią, albo zostaną zawieszone, albo dane zostaną utracone).
Fran
1
Jestem całkiem pewien, że @Fran ma rację - czy nie pojawia się cała masa wyników naraz, jeśli czekasz wystarczająco długo w trybie selekcji?
Izkata,
1
Bardzo mnie to zirytowało, ale dowiedziałem się, że jeśli przejdziesz do właściwości okien cmd, możesz odznaczyć „Tryb szybkiej edycji” i nie przejdziesz do trybu wyboru, klikając w oknie.
Zitrax,
2
@Zitrax tak, w ten sposób możesz zapobiec temu przypadkowi. Często kopiuję rzeczy z okna poleceń, więc tego nie robię. (cóż, właściwie używam Consoleza, który nie ma tego problemu)
JohnL
1
Nazywa się to „ blokowaniem ” ... tj .: aplikacja wywołuje, write()ale blokuje się.
Attie
50

Po kliknięciu w okno wiersza polecenia host konsoli nie będzie już zezwalał na zapisywanie danych wyjściowych. Sama aplikacja działa, ale nic nie jest zapisywane na ekranie.

Oczywiście, dopóki istnieje tylko jeden wątek, jest to w zasadzie to samo, co zamrożenie procesu. Ponieważ pojedynczy wątek próbuje zapisać dane wyjściowe przed wykonaniem większej ilości pracy.

Jeśli uruchomię ping -t localhosti kliknę w okno wiersza polecenia, będę mógł sprawdzić stos wywołań głównego ping.exewątku za pomocą Process Explorer .

wprowadź opis zdjęcia tutaj

Widzimy, że ping.exepróbował napisać jakieś wyjście. To nazywa write()się w bibliotece C Runtime. Ta funkcja w pewnym momencie wywołuje GetConsoleMode . Wygląda na to, że funkcja sprawdzi, czy użytkownik jest aktualnie w trybie oznaczania, i w razie potrzeby wykona blok.

Dalsza analiza

Możemy kolejny dowód na to zachowanie, badając zachowanie pingz Wireshark

Podczas działania ping -t superuser.comwidzimy następujące dane wyjściowe w Wireshark:
wprowadź opis zdjęcia tutaj

Teraz zaznaczmy pole w wierszu polecenia.
wprowadź opis zdjęcia tutaj
Nagle w Wireshark nie są już rejestrowane żadne pingi. pingnie wysyła już żadnych pakietów.

Ale już wiedzieliśmy, że ...

Dobra, zobaczmy, czy wyjście jest rzeczywiście problem tutaj! Skierujmy wyjście do NULurządzenia:

wprowadź opis zdjęcia tutaj

Teraz nie ma już żadnego wyjścia. Możemy teraz zaznaczać tekst w polu przez cały dzień, pakiety będą logowane w Wireshark.

wprowadź opis zdjęcia tutaj

Der Hochstapler
źródło
Gdybym nie dał +1 dla oryginalnej odpowiedzi,
dałbym
6

Jest tak, ponieważ okno weszło w tryb zaznaczania. Po naciśnięciu klawisza Enter kopiuje zaznaczony tekst do schowka. O ile mi wiadomo, nie ma takiego ustawienia, więc nie jestem pewien, dlaczego tak się dzieje po kliknięciu w okno. Zwykle musisz kliknąć prawym przyciskiem myszy i nacisnąć „Zaznacz”. Sprawdź, czy na klawiaturze nie utknęły żadne klawisze.

Brandon J. Dusseau
źródło
A co robi „tryb zaznaczania”? Czy to wstrzymuje proces?
Adam Arold,
Tryb zaznaczania służy do kopiowania tekstu z okna poleceń. AFAIK to jedyne zastosowanie, ale przypuszczam, że mogą istnieć inne.
Garrett,
7
Ustawienie to nazywa się Tryb szybkiej edycji. Kliknij ikonę w lewym górnym rogu, wybierz Właściwości i wybierz Tryb szybkiej edycji na karcie Opcje. Z tego, co wiem, proces będzie kontynuowany w tle, dopóki nie będzie musiał wchodzić w interakcje z konsolą, w którym to momencie zostanie zablokowany
JohnL
@JohnL, proszę utwórz odpowiedź, ponieważ szukam Twojego komentarza.
Adam Arold,
@edem Dodano odpowiedź :)
JohnL
6

Twoje okna CMD są w trybie szybkiej edycji, który automatycznie przechodzi do trybu edycji po kliknięciu na ekranie. Enter służy do skopiowania tekstu do białej skrzynki i wyjścia z trybu edycji.

Zwykle CMD wchodzi w tryb edycji tylko po kliknięciu prawym przyciskiem myszy na czarnym ekranie i wybraniu Zaznacz.

Aby powrócić do normalnego, kliknij prawym przyciskiem myszy pasek tytułu okien i wybierz Właściwości, wybierz kartę Opcje i odznacz „Tryb szybkiej edycji”, a następnie kliknij OK.

Nam Phung
źródło
3

Podczas wybierania tekstu do skopiowania z okna (w Marktrybie) system zawiesza bieżący proces w tym oknie.

Przykładowy plik wsadowy:

:test
echo %0
goto test

po uruchomieniu, gdy tylko zaznaczę obszar do skopiowania, ekran przestanie się przewijać

SeanC
źródło
Właśnie miałem opublikować dokładnie to samo (z wyjątkiem tego, że mój plik wsadowy był echo blah↵%0). :-)
Synetech,
1

Jak wszyscy tak ładnie zaznaczono, postęp dodatkowej produkcji jest blokowany podczas operacji znakowania. Również za pomocą alternatywnego kliknięcia myszy (domyślnie kliknięcie prawym przyciskiem myszy) lub naciskając klawisz Enter na klawiaturze możesz wyjść z trybu Oznacz i skopiować zaznaczony wybór do bufora wklejania systemu Windows. Istnieje inne wyjście, a mianowicie naciśnięcie klawisza Esc, aby zrezygnować z zaznaczania obszaru ekranu i zwolnić blok przy wyjściu. Zakłada się, że we właściwościach okna poleceń wybrano tryb QuickEdit. Możesz również bardziej celowo wejść w tę sytuację, mówiąc w oknie poleceń, że chcesz zaznaczyć tekst.

Dzień D
źródło
0

Aby dodatkowo potwierdzić stwierdzenie, że proces wstrzymuje się w „trybie zaznaczania”, np. Podczas kliknięcia myszą lub przeciągania wewnątrz granic okna cmd.exe, ale zatrzymuje każdą operację dopiero po całkowitym zakończeniu trwającej instancji, oferuję pośredni dowód:

[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.

Patrzysz na strumień rejestrowania instalacji programu Visual Studio, w którym narzędzie wiersza polecenia Instalatora programu Visual Studio sprawdza wszystkie zainstalowane obciążenia.

O 13:26:26 kliknąłem wewnątrz okna wiersza polecenia. Wyjście na ekran zatrzymuje się do 14:09:03, kiedy nacisnę Enter, aby wyjść z „Trybu zaznaczania”.

Zauważ teraz, że po 13:26:26 proces kończy się w celu sprawdzenia skrótu x86-23_r20.zip, komunikat „ powiodło się. Hash: X ” i uruchom ponownie z innym plikiem o 14:09:03, komunikat „ BEGIN: Weryfikacja” [..] AndroidSDKPrivateInstall.ps1

Podczas pauzy Narzędzie wiersza polecenia Instalatora programu Visual Studio zakończyło weryfikację przetwarzanego pliku, a dokładnie w momencie, gdy kontrolka miała zostać zwrócona do konsoli, rozpoczęła nową pracę sprawdzania skrótu.

pin8all
źródło