Ответ 1
Это очень по дизайну. Там нет разумного способа, которым пользователь может выбрать текст, когда ваша программа продолжает прокручивать содержимое окна консоли. Таким образом, консольная хост-программа просто перестает читать ваш вывод 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(), но вы не можете его заблокировать.
Если поведение по умолчанию опасно и рискует здоровьем человека, я настоятельно рекомендую вам нанять консультанта. И не знаю, кто написал этот ответ.