Предположим, я запускаю cmd.exe и пингую localhost. После этого я снова пингую localhost, но нажимаю в окно, и пинг останавливается, пока я не нажму enter .
Что происходит, когда я нажимаю в окно? Это приостанавливает процесс или что-то еще? Я приложил скриншот, чтобы прояснить эту проблему.
Примечание. На самом деле я не щелкаю, а перетаскиваю мышью, которая создает белое окно в окне, как вы можете видеть на скриншоте.
Редактировать: дальнейшее уточнение: что я действительно хочу знать, так это то, останавливает ли перетаскивание окна процесс cmd или нет?
Редактировать: еще больше уточнений: я знаю, что я использую Быстрое редактирование и нажимаю клавишу ВВОД, чтобы скопировать выбранное содержимое. Что я не знаю, так это то, что происходит в фоновом режиме.
источник
Ответы:
При выделении некоторого текста в окне cmd.exe процесс будет выполняться в фоновом режиме до следующей записи в стандартный вывод (или STDOUT, поток данных, отображаемый в окне cmd.exe).
Когда вы выйдете из режима выбора, процесс возобновится как обычно.
Вы можете проверить это, набрав
ping www.google.com -t
в окне cmd.exe и выбрав некоторую область вывода. Вы увидите паузу, и когда вы отмените выбор, выход возобновится.Изменить: Согласно комментарию Фрэн, вы можете использовать инструмент, такой как Wireshark, чтобы увидеть, что действие все еще происходит после того момента, когда вы сделали выбор, а затем останавливается.
источник
write()
но оно застревает.Как только вы щелкнете в окне командной строки, хост консоли больше не будет позволять записывать вывод. Само приложение продолжает работать, но на экран ничего не записывается.
Конечно, пока существует только один поток, это в основном то же самое, что заморозить ваш процесс. Поскольку единственный поток пытается записать некоторый вывод, прежде чем делать больше работы.
Если я запускаю
ping -t localhost
и щелкаю в окне командной строки, я могу затем проверить стек вызовов основногоping.exe
потока с помощью Process Explorer .Мы видим, что
ping.exe
пытались написать какой-то вывод. Этоwrite()
вызвало в библиотеке времени выполнения C. Эта функция в какой-то момент вызывает GetConsoleMode . Как представляется, эта функция проверит, находится ли пользователь в данный момент в режиме пометки, и при необходимости заблокирует выполнение.Дальнейший анализ
Мы можем дополнительно доказать это поведение, изучив поведение
ping
с WiresharkПри запуске
ping -t superuser.com
мы видим следующий вывод в Wireshark:Теперь давайте отметим поле в командной строке.
Неожиданно в Wireshark больше не пингуются.
ping
больше не отправляет никаких пакетов.Но мы уже знали это...
Хорошо, давайте посмотрим, является ли вывод действительно проблемой здесь! Давайте направим вывод на
NUL
устройство:Теперь нет больше никакого выхода. Теперь мы можем отмечать текст в поле весь день, пакеты будут регистрироваться в Wireshark.
источник
Это потому, что окно перешло в режим маркировки. Когда вы нажимаете ввод, он копирует выделенный текст в буфер обмена. Насколько мне известно, нет никаких настроек для этого, поэтому я не уверен, почему это происходит, когда вы просто нажимаете в окно. Обычно вы должны щелкнуть правой кнопкой мыши и нажать «Отметить». Убедитесь, что на клавиатуре не застряли клавиши.
источник
Ваши окна CMD находятся в режиме быстрого редактирования, который автоматически входит в режим редактирования, когда вы нажимаете на экран. Ввод предназначен для копирования текста в белое поле и выхода из режима редактирования.
Обычно CMD входит в режим редактирования только тогда, когда вы щелкаете правой кнопкой мыши на черном экране и выбираете Mark.
Чтобы вернуться к обычному режиму, щелкните правой кнопкой мыши строку заголовка окон и выберите «Свойства», выберите вкладку «Параметры», отмените выбор «Режим быстрого редактирования» и нажмите кнопку «ОК».
источник
Когда вы выбираете текст для копирования из окна (в
Mark
режиме), система приостанавливает текущий процесс в этом окне.Пример командного файла:
при запуске, как только я отмечаю область для копирования, экран перестает прокручиваться
источник
echo blah↵%0
).:-)
Как все прекрасно отметили, дополнительный вывод блокируется во время выполнения операции пометки. Кроме того, либо с помощью альтернативного щелчка мыши (по умолчанию щелкните правой кнопкой мыши), либо нажав клавишу Enter на клавиатуре, вы можете выйти из режима пометки и скопировать выделенный выбор в буфер вставки Windows. Есть и другой выход - нажать клавишу Esc, чтобы отменить выделение области экрана и освободить блок при выводе. Это предполагает, что в свойствах этого командного окна выбран режим QuickEdit. Вы также можете сознательно войти в эту ситуацию, сообщив командному окну, что вы хотите выделить какой-то текст.
источник
Чтобы дополнительно подтвердить утверждение о том, что процесс приостанавливается в «режиме пометки», например, во время щелчка мышью или перетаскивания внутри границ окна cmd.exe, но останавливает любую операцию только после полного завершения выполняющегося экземпляра, я предлагаю косвенное доказательство:
Вы просматриваете поток журналирования установки 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 завершила проверку обрабатываемого файла, и в тот момент, когда элемент управления должен был быть возвращен на консоль, началась новая проверка хеша.
источник