У меня есть "hello world" Windows настольное приложение, источником которого является это официальное прохождение .
Когда я запускаю эту программу из Windows Подсистема для Linux, я получаю ожидаемое поведение: оболочка блокируется, ожидая завершения процесса, и приглашение оболочки появляется только после завершения процесса. Затем я могу проверить код завершения процесса (здесь установлен на 3, возвращая это из wWinMain
):
jim@LAPTOP-SMUS1UJN:/mnt/c/Users/james/source/repos/DesktopApp/x64/Release$ ./DesktopApp.exe # blocks until I close the window ...
jim@LAPTOP-SMUS1UJN:/mnt/c/Users/james/source/repos/DesktopApp/x64/Release$ echo $?
3
Однако , это не то поведение, которое я получаю при запуске программа из командной строки или из PowerShell. Здесь процесс начинается, но оболочка утверждает, что процесс немедленно завершился, и сразу же выдается новое приглашение! Но процесс явно не завершен, поскольку созданное им окно все еще существует, и я могу взаимодействовать с ним.
В обоих случаях (Windows Подсистема для Linux и PowerShell) стандартный вывод процесса не выводится на терминал. (Проверено с std::cout << "test"
, который ничего не печатает на терминал.)
Это как если бы оригинальный процесс породил процесс демона для запуска win32. Но я не думаю, что это именно то, что происходит, потому что Windows Подсистема для Linux как минимум блокирует до выхода.
Когда я создаю «консольное» приложение C ++ в Visual Studio, оно ведет себя, как и ожидалось. Странное поведение «ранний выход без вывода» происходит только для моей «настольной» программы win32.
Итак, почему командная строка или PowerShell утверждают, что процесс завершается немедленно? И где его стандартный вывод?