Czy wystarczy uruchomić program, podać dane wejściowe, poczekać, aż program się zakończy i odczytać dane wyjściowe? Czy potrzeba pełnej interakcji?
Jeżeli to drugie, czyli pełna interakcja, to najprościej pójść zupełnie innym sposobem. Na komputerze uruchomić serwer telnet, a Twój program niech będzie klientem telnet. W tym przypadku nie szkodzi, że połączenie nie jest szyfrowane, bo będzie na localhost, czyli dane nie będą wychodzić poza komputer. Po zestawieniu połączenia trzeba się zalogować swoim użytkownikiem (nie wiem, jak będzie w przypadku Windows, w przypadku Linux na pewno tak jest) i ma się już konsolę.
O ile sam protokół telnet jest bardzo prosty, o tyle poprawność wyświetlania uruchamianych programów zależy od implementacji standardu ANSI i VT100. W najprostszym przypadku nie ma kodów ucieczki. Tak naprawdę, to musiałbyś zaimplementować dwie rzeczy, czyli protokół telnet i emulator terminala ANSI i VT100 (w większości przypadków wystarczy częściowa kompatybilność).
W przypadku przekierowania strumienia we/wy, jak już proponowano, to też da się obsłużyć programy interaktywne i ze skomplikowanym interfejsem w taki sposób, że odczyt strumienia wyjścia następuje w pętli uruchamianej w osobnym wątku, Jeżeli cokolwiek zostanie odczytane, to nastąpi przetworzenie i wyświetlanie. W ten sposób na Windows można uruchomić cmd.exe i będzie mniej więcej działać. Mniej więcej, bo jak ja to przerabiałem, to generalnie dało sie wpisywać polecenia, ale nie do końca dobrze dział backspace. Jednak uruchomienie programu ping lub ewentualnie przygotowanie pliku *.bat, który uruchamia ping i uruchomienie polecenia cmd.exe /C somefile.bat
nie powinno być problemem, uruchomi się konsola, od razu wykona się polecenie, Twój program odbierze wynik i będziesz mieć.
Mam taki jeden projekt, w którym zastosowałem obydwa sposoby interakcji z konsolą: https://github.com/andrzejlisek/TextPaint
Ten projekt jest w C#, przedstawiam klasy związane z połączeniami, żeby mieć pojęcie, jak to zrobić:
https://github.com/andrzejlisek/TextPaint/blob/master/TextPaintFramework/TextPaint/UniConnTelnet.cs
https://github.com/andrzejlisek/TextPaint/blob/master/TextPaintFramework/TextPaint/UniConnApp.cs
Tutaj nowszy projekt zastępujący wyżej wymieniony: https://github.com/andrzejlisek/TextPaintWeb
Tutaj protokół telnet od strony klienta:
https://github.com/andrzejlisek/TextPaintWeb/blob/main/prog/terminalconnworkertelnet.h
https://github.com/andrzejlisek/TextPaintWeb/blob/main/prog/terminalconnworkertelnet.cpp
W tej aplikacji jest zastosowany taki myk, że uruchamiam własny serwer WebSocket, który przyjmuje i wysyła bajty w sieć tak, jak leci, serwer "nie zna" żadnego protokołu.
Dobry opis kodów ucieczki jest tutaj: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
Jeżeli w ogóle coś uruchomisz, to na początek wystarczą kody stąd: https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
Generalnie, można powiedzieć, że ja ten temat przerabiałem, samo podłączenie się do aplikacji nie jest trudne, ale pełna zgodność z VT100 nie jest łatwa. Jednak ja testowałem na programie VTTEST i animacjach z http://artscene.textfiles.com/vt100/ więc wymagania odnośnie kompatybilności były wyższe.
Żeby było jeszcze śmieszniej, to w Windows 11 są dwie aplikacje konsoli, przetestowałem je na wylot programem VTTEST uruchomionym przez cygwin i generalnie działają mniej więcej dobrze, ale okazało się mój program bije microsoftowe programy kompatybilnością. W VTTEST są testy, które mój program wyświetla poprawnie, a ten od M$ z błędami.