Как программа информирует консоль о запросе ввода?
Никак она не знает. Когда запускается код запроса пользовательских данных, то он так же включает механизм "эха", т.е. введённый символ так же отправляется на вывод, чтобы пользователь видел свой труд.
Во время выполнения программы так же можно тыкать в клаву, и эти данные уйдёт на ввод, просто мы не видим их на экране. Бывают даже программы, где перед запуском кода запроса данных от пользователя они не очищают буфер и весь тот мусор, что мы жамкали раньше попадает на вход.
А зачем консоли что-то понимать? Если ваша программа запущена в foreground, то она перехватывает stdin, stdout и stderr на себя и консоль просто ждёт завершения программы. Если запущена в фоне, то у неё свои потоки, никак не связанные с консолью, и консоли всё равно, что делает программа.