Что он делает точно, если я нажимаю в окне cmd?

45

Предположим, я запускаю cmd.exe и пингую localhost. После этого я снова пингую localhost, но нажимаю в окно, и пинг останавливается, пока я не нажму enter .

Что происходит, когда я нажимаю в окно? Это приостанавливает процесс или что-то еще? Я приложил скриншот, чтобы прояснить эту проблему.

Примечание. На самом деле я не щелкаю, а перетаскиваю мышью, которая создает белое окно в окне, как вы можете видеть на скриншоте.

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

Редактировать: еще больше уточнений: я знаю, что я использую Быстрое редактирование и нажимаю клавишу ВВОД, чтобы скопировать выбранное содержимое. Что я не знаю, так это то, что происходит в фоновом режиме.

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

Адам Арольд
источник
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, чтобы увидеть, что действие все еще происходит после того момента, когда вы сделали выбор, а затем останавливается.

JohnL
источник
3
Одно это не проверяет. Вам также нужно запустить Wireshark и посмотреть, перестанут ли отправляться пакеты ICMP. Если это так, вы правы, что процесс приостановлен. Если нет, процесс не приостанавливается, и вывод просто буферизуется (пока буферы не заполнятся, тогда он либо будет приостановлен, либо данные будут потеряны).
Фран
1
Я вполне уверен, что @Fran прав - разве сразу не появляется целая куча результатов, если вы достаточно долго ждали в режиме выбора?
Изката
1
Это меня сильно раздражало, но я обнаружил, что если вы перейдете в свойства окон cmd, вы можете отменить выбор «Режим быстрого редактирования», и вы не войдете в режим выбора, щелкнув в окне.
Цитракс
2
@Zitrax да, вот как вы можете предотвратить это случайно. Я часто копирую вещи из своего командного окна, поэтому я этого не делаю. (ну, на самом деле я использую Consolez, у которого нет этой проблемы)
JohnL
1
Это называется « блокирование » ... то есть: приложение вызывает, write()но оно застревает.
Attie
50

Как только вы щелкнете в окне командной строки, хост консоли больше не будет позволять записывать вывод. Само приложение продолжает работать, но на экран ничего не записывается.

Конечно, пока существует только один поток, это в основном то же самое, что заморозить ваш процесс. Поскольку единственный поток пытается записать некоторый вывод, прежде чем делать больше работы.

Если я запускаю ping -t localhostи щелкаю в окне командной строки, я могу затем проверить стек вызовов основного ping.exeпотока с помощью Process Explorer .

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

Мы видим, что ping.exeпытались написать какой-то вывод. Это write()вызвало в библиотеке времени выполнения C. Эта функция в какой-то момент вызывает GetConsoleMode . Как представляется, эта функция проверит, находится ли пользователь в данный момент в режиме пометки, и при необходимости заблокирует выполнение.

Дальнейший анализ

Мы можем дополнительно доказать это поведение, изучив поведение pingс Wireshark

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

Теперь давайте отметим поле в командной строке.
введите описание изображения здесь
Неожиданно в Wireshark больше не пингуются. pingбольше не отправляет никаких пакетов.

Но мы уже знали это...

Хорошо, давайте посмотрим, является ли вывод действительно проблемой здесь! Давайте направим вывод на NULустройство:

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

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

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

Der Hochstapler
источник
Если бы у меня не было +1 для исходного ответа, я бы сейчас +1 для «Дальнейшего анализа»
JohnL
6

Это потому, что окно перешло в режим маркировки. Когда вы нажимаете ввод, он копирует выделенный текст в буфер обмена. Насколько мне известно, нет никаких настроек для этого, поэтому я не уверен, почему это происходит, когда вы просто нажимаете в окно. Обычно вы должны щелкнуть правой кнопкой мыши и нажать «Отметить». Убедитесь, что на клавиатуре не застряли клавиши.

Брэндон Дж. Дюссо
источник
А что делает "Режим Марка"? Это приостанавливает процесс?
Адам Арольд
Режим пометки используется для копирования текста из командного окна. AFAIK это единственное использование, хотя я предполагаю, что могут быть и другие.
Гарретт
7
Настройка называется режимом быстрого редактирования. Нажмите значок в верхнем левом углу, выберите «Свойства» и выберите «Режим быстрого редактирования» на вкладке «Параметры». Из того, что я знаю, процесс будет продолжаться в фоновом режиме до тех пор, пока ему не понадобится взаимодействовать с консолью, после чего он будет блокироваться
JohnL
@JohnL, пожалуйста, создайте ответ, потому что ваш комментарий - это то, что я ищу.
Адам Арольд
@edem Добавил ответ :)
JohnL
6

Ваши окна CMD находятся в режиме быстрого редактирования, который автоматически входит в режим редактирования, когда вы нажимаете на экран. Ввод предназначен для копирования текста в белое поле и выхода из режима редактирования.

Обычно CMD входит в режим редактирования только тогда, когда вы щелкаете правой кнопкой мыши на черном экране и выбираете Mark.

Чтобы вернуться к обычному режиму, щелкните правой кнопкой мыши строку заголовка окон и выберите «Свойства», выберите вкладку «Параметры», отмените выбор «Режим быстрого редактирования» и нажмите кнопку «ОК».

Нам Фунг
источник
3

Когда вы выбираете текст для копирования из окна (в Markрежиме), система приостанавливает текущий процесс в этом окне.

Пример командного файла:

:test
echo %0
goto test

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

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

Как все прекрасно отметили, дополнительный вывод блокируется во время выполнения операции пометки. Кроме того, либо с помощью альтернативного щелчка мыши (по умолчанию щелкните правой кнопкой мыши), либо нажав клавишу Enter на клавиатуре, вы можете выйти из режима пометки и скопировать выделенный выбор в буфер вставки Windows. Есть и другой выход - нажать клавишу Esc, чтобы отменить выделение области экрана и освободить блок при выводе. Это предполагает, что в свойствах этого командного окна выбран режим QuickEdit. Вы также можете сознательно войти в эту ситуацию, сообщив командному окну, что вы хотите выделить какой-то текст.

DDay
источник
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, сообщение « успешно выполнено. Хэш: X » и перезапускается с другим файлом в 14:09:03, сообщение « НАЧАЛО: Проверка» [..] AndroidSDKPrivateInstall.ps1 "

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

pin8all
источник