39

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

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

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

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

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

7 ответов7

45

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

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

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

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

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

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

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

Теперь давайте отметим поле в командной строке.

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

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

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

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

25

При выделении некоторого текста в окне cmd.exe процесс будет выполняться в фоновом режиме до следующей записи в стандартный вывод (или STDOUT, поток данных, отображаемый в окне cmd.exe).

Когда вы выйдете из режима выбора, процесс возобновится как обычно.

Вы можете проверить это, набрав ping www.google.com -t в окне cmd.exe и выбрав некоторую область вывода. Вы увидите паузу, и когда вы отмените выбор, выход возобновится.

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

6

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

5

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

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

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

3

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

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

:test
echo %0
goto test

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .