Тогда программа выглядит как запущенная в другом потоке, отличном от cmd.
Ну, программа работает в отдельном процессе, который имеет свои потоки.
В Windows существует два основных типа программ: консольные и оконные.
Консольные программы обычно представляют собой приложения в текстовом режиме, которые печатают текст. Они уже ведут себя так, как вы хотите: вы запускаете программу, оболочка (cmd.exe
) ждет, пока она закончит работу, прежде чем вернуться к интерактивному приглашению. Если программа работает долго, принудительное завершение cmd.exe
завершит работу программы.
Оконные программы - это, как правило, приложения с графическим интерфейсом пользователя (например, notepad.exe
, explorer.exe
, firefox.exe
). Они ведут себя не так, как вы хотите: когда вы запускаете их через cmd.exe
, cmd.exe
не ожидает их и немедленно возвращает вас к интерактивному запросу. Выполненная программа запускается независимо от cmd.exe
, и завершение одного не влияет на другое.
Обратите внимание, что консольные программы могут иметь окна, а оконные программы могут иметь консольный вывод. Так что же делает программу "консольной" или "оконной"?
Часть .exe
указывает, должен ли он работать с подсистемой "консоль" или с подсистемой "windows". Это настраивается (часто неявно), когда программа была собрана. Это можно изменить после сборки программы; editbin.exe
(входит в состав Visual Studio) может изменить файл .exe
и изменить подсистему, которую должна использовать программа.
Если вы просто хотите увидеть вывод stdout и stderr, вам не нужно изменять файл .exe
. Обычно оконные приложения не отправляют этот вывод куда-либо, но вы можете изменить это с помощью каналов / перенаправлений. Например, вы можете запустить:
SomeWindowedApplication.exe > output.txt
или, если у вас есть cat
(или ее эквивалент):
SomeWindowedApplication.exe | cat
Это также приведет к тому, что cmd.exe
будет ожидать завершения работы программы, прежде чем вернуться в интерактивное приглашение. Обратите внимание, что это не имеет требуемого поведения завершения (т. Е. Завершение cmd.exe
в последнем примере приведет к завершению cat.exe
, а не ShowWindowedApplication.exe
).
Также см: