Как и почему режим QuickEdit в командных запросах заморозит приложения?

Недавно я столкнулся с проблемой с командной строкой в ​​Windows, где был включен режим QuickEdit, и щелчок по окну выбирал текст и вешал запущенную программу. Это, по-видимому, известное поведение – я нашел несколько вопросов, связанных с ним:

  • Окно командной строки Windows, висящая в RDP Windows
  • Запуск приложения Windows Console
  • Как отключить режим QuickEdit для отдельных сценариев

Как приложение «приостановлено» / «приостановлено»? Является ли процесс похожим на сигнал SIGSTOP на * nix? (Мне также интересно понять, почему эта функциональность существует в первую очередь? Это кажется неинтуитивным и опасным.)

Это очень по дизайну. Нет разумного способа, чтобы пользователь мог выбрать текст, когда ваша программа продолжает прокручивать содержимое windows консоли. Таким образом, консольная хост-программа просто перестает читать ваш вывод stdout / stderr, и ваша программа зависает, пока пользователь не завершит операцию. Это можно изменить, вам придется вызвать Get + SetConsoleMode () и отключить параметр ENABLE_QUICK_EDIT_MODE.

Обратите внимание, что эта «зависание» принципиально не отличается от пауз выполнения, которые вы получаете, когда ваша программа генерирует вывод stdout со скоростью, намного превышающей ее консольный хост. Хотя эти задержки конечны.

И это не единственный способ, которым пользователь может остановить вашу программу, он также может просто нажать Ctrl + S. Нажатие Ctrl + Q возобновляет его снова. Если вы достаточно взрослые, вы можете распознать эти управляющие коды как Xon / Xoff , символы рукопожатия для терминала. Это то, что на самом деле представляет собой консоль, простая эмуляция терминала так же, как и в 1970-х годах. Это также можно изменить, вам придется перестать полагаться на встроенный буферный вход в консоль и переключиться на ReadConsole () . Или, отключив опцию консоли ENABLE_LINE_INPUT, не так уверен, какие побочные эффекты, которые с тех пор, как вы не упоминали о какой-либо языковой среде, вам придется попробовать.

И, конечно, прекратить свою программу очень легко. Вы получаете EOF на stdin, когда пользователь набирает Ctrl + Z, что должно закончиться вашей программой. И есть Ctrl + C и Ctrl + Break для мгновенного завершения, независимо от того, что делает ваша программа. Вы можете получить уведомление для них с помощью SetConsoleCtrlHandler (), но вы не можете его заблокировать.

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

Мне было очень сложно узнать, почему мое приложение C # некоторое время не отвечало, пока я не нажал клавишу! Для тех, кто нуждается в программном отключении QuickEdit, смотрите здесь .