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.
windows-7
command-line
Adam Arold
źródło
źródło
Odpowiedzi:
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 -t
w 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ę.
źródło
write()
ale blokuje się.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 localhost
i kliknę w okno wiersza polecenia, będę mógł sprawdzić stos wywołań głównegoping.exe
wątku za pomocą Process Explorer .Widzimy, że
ping.exe
próbował napisać jakieś wyjście. To nazywawrite()
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
ping
z WiresharkPodczas działania
ping -t superuser.com
widzimy następujące dane wyjściowe w Wireshark:Teraz zaznaczmy pole w wierszu polecenia.
Nagle w Wireshark nie są już rejestrowane żadne pingi.
ping
nie 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
NUL
urządzenia:Teraz nie ma już żadnego wyjścia. Możemy teraz zaznaczać tekst w polu przez cały dzień, pakiety będą logowane w Wireshark.
źródło
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.
źródło
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.
źródło
Podczas wybierania tekstu do skopiowania z okna (w
Mark
trybie) system zawiesza bieżący proces w tym oknie.Przykładowy plik wsadowy:
po uruchomieniu, gdy tylko zaznaczę obszar do skopiowania, ekran przestanie się przewijać
źródło
echo blah↵%0
).:-)
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.
źródło
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:
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.
źródło