Що саме робити, якщо натиснути у вікні cmd?


45

Припустимо, я запускаю cmd.exe і пінг localhost. Після цього я знову ping localhost, але я натискаю у вікно, і ping зупиняється, поки не натискаю клавішу Enter .

Що саме відбувається, коли я натискаю у вікно? Призупиняє процес чи щось інше? Я додав скріншот, щоб уточнити цю проблему.

Примітка. Я насправді не натискаю, а перетягую за допомогою миші, яка створює біле поле у ​​вікні, як ви бачите на скріншоті.

Редагувати: подальше уточнення: що я дійсно хочу знати, чи перетягування вікна зупиняє процес cmd чи ні?

Редагувати: ще більше роз'яснення: я знаю, що я використовую швидке редагування та натискання клавіші enter, щоб копіювати вибраний нами вміст. Я не знаю, що відбувається на задньому плані.

введіть тут опис зображення


2
До речі, ви можете проголосувати за UserVoice, щоб змінити таку поведінку: wpdev.uservoice.com/forums/…
Карл Уолш

Приємно. Я проголосував за це.
Адам Арольд

Голосування просто переносить мене на сторінку 404
Келлі Банг

1
І що ще важливіше, ось як вимкнути цю жахливу особливість бога stackoverflow.com/a/37578608/463967
Алан Макдональд

Відповіді:


27

Вибираючи текст у вікні cmd.exe, процес триватиме у фоновому режимі до наступного запису до стандартного виводу (або STDOUT, потік даних якого відображається у вікні cmd.exe).

Після виходу з режиму вибору процес відновиться як звичайний.

Ви можете перевірити це, ввівши ping www.google.com -tу вікно cmd.exe і вибравши деяку область виводу. Ви побачите, що це пауза, і коли ви скасуєте вибір, результат відновиться.

Редагувати: Відповідно до коментаря Фран, ви можете використовувати такий інструмент, як Wireshark, щоб побачити, що активність все-таки відбувається після моменту, коли ви зробили вибір, а потім зупиняється.


3
Це одне це не тестує. Вам також потрібно запустити Wireshark і подивитися, чи перестають надсилатись пакети ICMP. Якщо так, то ви праві, що процес призупинено. Якщо ні, процес не призупиняється, а вихід просто буферується (поки буфери не заповняться, то він або призупиняється, або дані втрачаються).
Фран

1
Я досить впевнений, що @Fran має рацію - чи не з’являється одразу ціла купа результатів, якщо ви досить довго чекали в режимі вибору?
Ізката

1
Це мене дуже дратувало, але я дізнався, що якщо ви перейдете до властивостей cmd windows, ви можете зняти позначку "Швидкий режим редагування", і ви не ввійдете в режим вибору, натиснувши у вікно.
Zitrax

2
@Zitrax так, так ви можете запобігти випадковості. Я часто копіюю речі з мого вікна команд, тому цього не роблю. (ну, насправді я використовую Consolez, у якого цього питання немає)
JohnL

1
Це називається " блокування " ... тобто: додаток дзвонить, write()але він застрягає.
Attie

50

Після натискання на вікно командного рядка хост консолі більше не дозволить записувати вихід. Сама програма продовжує працювати, але на екрані нічого не пишеться.

Звичайно, якщо є лише одна нитка, це в основному те саме, що заморозити ваш процес. Оскільки один потік намагається написати деякий вихід, перш ніж робити більшу роботу.

Якщо я запускаю ping -t localhostі натискаю у вікно командного рядка, я можу перевірити стек виклику основного ping.exeпотоку за допомогою Провідника процесорів .

введіть тут опис зображення

Ми бачимо, що ping.exeнамагалися написати деякий вихід. Він зателефонував write()у бібліотеку С на час виконання. Ця функція в якийсь момент викликає GetConsoleMode . Як здається, ця функція перевірить, чи користувач зараз перебуває в режимі відмітки, і блокує виконання при необхідності.

Подальший аналіз

Ми можемо ще одне підтвердження цієї поведінки, досліджуючи поведінку pingз Wireshark

Під час запуску ping -t superuser.comми бачимо наступний вихід у Wireshark:
введіть тут опис зображення

Тепер позначимо поле в командному рядку.
введіть тут опис зображення
Раптом у Wireshark більше не записується пінг. pingбільше не надсилає жодних пакетів.

Але ми це вже знали ...

Правильно, давайте подивимось, чи тут насправді є вихід ! Давайте спрямуємо вихід на NULпристрій:

введіть тут опис зображення

Тепер вже немає жодного виходу. Тепер ми можемо позначати текст у полі весь день, пакети будуть входити в Wireshark.

введіть тут опис зображення


Якби я ще не поставив +1 до оригінальної відповіді, я би поставив +1 зараз для "Подальший аналіз"
JohnL

6

Це тому, що вікно увійшло в режим маркування. Коли ви натискаєте клавішу Enter, вона копіює вибраний текст у буфер обміну. Наскільки мені відомо, для цього немає налаштувань, тому я не впевнений, чому це робиться, коли ти просто клацнеш у вікно. Зазвичай потрібно клацнути правою кнопкою миші та натиснути "Позначити". Переконайтеся, що жодна клавіша не застрягла на вашій клавіатурі.


А що робить "Режим маркування"? Це призупиняє процес?
Адам Арольд

Режим позначення використовується для копіювання тексту з вікна команд. AFAIK - це єдине використання, хоча, мабуть, можуть бути й інші.
Гаррет

7
Налаштування називається режим швидкого редагування. Клацніть піктограму у верхньому лівому куті, виберіть "Властивості" та виберіть "Швидкий режим редагування" на вкладці "Параметри". З того, що я знаю, процес триватиме у фоновому режимі, поки йому не потрібно буде взаємодіяти з консоллю, і в цей момент він заблокується
JohnL

@JohnL, будь ласка, створіть відповідь, оскільки ваш коментар - це те, що я шукаю.
Адам Арольд

@edem Додав відповідь :)
JohnL

6

Ваші вікна CMD перебувають у режимі швидкого редагування, який автоматично переходить у режим редагування при натисканні на екран. Enter призначений для копіювання тексту у поле білого поля та виходу з режиму редагування.

Зазвичай CMD переходить у режим редагування лише тоді, коли клацніть правою кнопкою миші на чорному екрані та виберіть Позначити.

Щоб повернутися до звичайного, клацніть правою кнопкою миші на заголовку вікна та виберіть "Властивості", виберіть вкладку "Параметри" та зніміть позначку "Швидкий режим редагування" та натисніть кнопку ОК.


3

Коли ви вибираєте текст для копіювання з вікна (коли в Markрежимі), система призупиняє поточний процес у цьому вікні.

Приклад пакетного файлу:

:test
echo %0
goto test

коли це запускається, як тільки я позначаю область для копіювання, екран перестає прокручуватися


Я збирався опублікувати абсолютно те саме (за винятком того, що мій пакетний файл echo blah↵%0). :-)
Synetech

1

Оскільки всі так красиво зазначали, прогрес додаткового виходу блокується під час операції з маркуванням. Також за допомогою альтернативного клацання миші (клацання правою кнопкою миші за замовчуванням) або натискання клавіші Enter на клавіатурі ви можете вийти з режиму маркування та скопіювати позначений вибір у буфер вставки для Windows. Є ще один вихід - це натиснути клавішу Esc, щоб відмовитися від маркування області екрану і звільнити блок на виході. Це передбачає, що у властивостях цього командного вікна вибрано режим QuickEdit. Ви також можете потрапити в цю ситуацію більш навмисно, сказавши командному вікні, що ви хочете вибрати якийсь текст.


0

Для подальшого підтвердження твердження про те, що процес призупиняється в режимі «Позначити», наприклад, під час натискання миші або перетягування всередину меж вікна cmd.exe, але зупиняє будь-яку операцію лише після повного закінчення роботи з екземпляром, я пропоную непряме підтвердження:

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

Ви переглядаєте потік журналу установки Visual Studio, де утиліта командного рядка налаштування Visual Studio перевіряє всі встановлені робочі навантаження.

О 13:26:26 я натиснув всередину вікна командного рядка. Вихід на екран зупиняється до 14:09:03, коли я натиснув клавішу Enter, щоб вийти з "режиму маркування".

Тепер зауважте, що після 13:26:26 процес закінчується, щоб перевірити хеш x86-23_r20.zip, повідомлення " вдалося. Хеш: Х " та перезавантажте інший файл о 14:09:03, повідомлення "НАЧАЙТЕ : Перевірка" [..] AndroidSDKPrivateInstall.ps1 "

Під час паузи утиліта командного рядка налаштування Visual Studio завершила перевірку файлу, який оброблявся, і саме в той момент, коли керування потрібно було повернути на консоль, розпочалася нова перевірка роботи хешу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.