Ich benutze CreateProcess
, um einen interaktiven Skript-Interpreter zu starten und möchte stdin/stdout/stderr vom/zum Interpreter transparent weiterleiten.Wie starte ich einen Prozess korrekt und übergebe stdin/stdout/stderr?
Mein erster Versuch zur Einrichtung war die STARTUPINFO
Struktur wie
CreateProcess
geben
STARTUPINFOA si = { sizeof(si) };
si.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
si.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
si.dwFlags |= STARTF_USESTDHANDLES;
D.h. Ich habe versucht, den Skript-Interpreter-Prozess dazu zu bringen, den gleichen Handle zum Lesen/Schreiben zu verwenden, wie mein Launcher-Prozess verwendet. Das schien nicht zu funktionieren (ich bin mir nicht einmal sicher, ob diese Standard-Handles vererbt werden können).
Eine zweite Idee, die auf dem Creating a Child Process with Redirected Input and Output Beispiel basiert, besteht darin, drei Pipes einzurichten, um alle Daten, die an eine der Pipes geschrieben wurden, weiterzuleiten. Da ich nicht wissen kann, wie man darauf wartet, dass Daten in mehr als eine Datei geschrieben werden (WaitForMultipleObjects
kann nicht auf Pipes synchronisiert werden), habe ich überlegt, drei Threads zu haben, von denen jeder einen blockierenden ReadFile
Aufruf auf einer Pipe ausführt.
Ich vermute, dass dies vielleicht zu viel ist, aber ich frage mich: gibt es einen einfacheren Weg, dies zu tun? Ich muss keinerlei Verarbeitung der Daten durchführen, die von/an den Skript-Interpreter übertragen wurden.
Als Randnotiz benutze ich unter Linux execvp
, um nur den aktuellen Prozess durch den Skript-Interpreter-Prozess zu ersetzen, aber unter Windows muss ich den Skript-Interpreter mit dem Haupt-Thread im suspendierten Zustand starten (damit ich es kann) mach ein Bytecode-Patching) - also, da _execvp unter Windows verfügbar zu sein scheint, muss ich CreateProcess verwenden.
möglich Duplikat von [Making CreateProcess erbt die Konsole des aufrufenden Prozesses] (http://stackoverflow.com/questions/340356/making-createprocess-inherit-the-console-of-the-calling-process) –
Re : Wie man auf I/O auf mehr als einer Datei wartet. Sie erstellen eine OVERLAPPED-Struktur mit einem Ereignishandle für jedes Dateihandle und geben asynchrone E/A-Anforderungen (z. B. ReadFile) aus, die diese OVERLAPPED-Strukturen übergeben. Warten Sie dann auf diese Ereignishandles. –
Könnten Sie das in einer Antwort näher erläutern, @Igor? Das scheint der Hauptunterschied von [vorheriger] zu sein (http://stackoverflow.com/questions/5485923/launch-an-exe-process-with-stdin-stdout-and-stderr) [Fragen] (http: // Paketüberfluss.com/questions/340356/making-createprocess-erben-die-konsole-des-rufenden-prozesses) hier. – Shog9