Plattformübergreifende Umleitung der Standardeingabe und -ausgabe des erzeugten Prozesses in nativem C / C ++ (Bearbeitung mit Lösung)

Ich habe einen Zeichenfolgenbefehl, den ich asynchron ausführen möchte, während ich in seine Eingabe schreibe und seine Ausgabe lese. Klingt einfach, richtig, der Teufel ist plattformübergreifend. Ich ziele sowohl auf MSVC / Win32 als auch auf gcc / Linux ab und möchte offensichtlich die Mindestmenge an plattformspezifischem Code schreiben. Mein google-fu hat versagt, ich bekomme zu viel Lärm für meine Abfragen, also habe ich mit dem begonnen, was ich weiß.

Popen - nice and easy, gibt FILE * zurück, das überall leicht zu konsumieren ist. Aber hier ist wasMSDN muss zu _popen sagen:

Bei Verwendung in einem Windows-Programm gibt die Funktion _popen einen ungültigen Dateizeiger zurück, der dazu führt, dass das Programm auf unbestimmte Zeit nicht mehr reagiert. _popen funktioniert ordnungsgemäß in einer Konsolenanwendung. Informationen zum Erstellen einer Windows-Anwendung, die die Eingabe und Ausgabe umleitet, finden Sie unter Erstellen eines untergeordneten Prozesses mit umgeleiteten Eingaben und Ausgaben im Platform SDK.

und so kommt popen nicht in frage (edit: weil ich möchte, dass mein code in der GUI-anwendung funktioniert). Die Art und Weise, wie Windows es macht, ist meiner Meinung nach ziemlich hässlich und ausführlich. Ich könnte mit plattformspezifischem Spawn-Code leben, aber ich möchte, dass mindestens der E / A-Code der gleiche ist. Hier habe ich allerdings eine Mauer zwischen die WinAPI gestoßenHANDLEs und CFILE*, undint Dateideskriptor. Gibt es eine Möglichkeit, aHANDLE zuFILE* oderint fd oder umgekehrt? (Google hat mich in diesem Fall erneut gescheitert. Alle Keywords, die ich ausprobiert habe, werden viel zu oft verwendet.)

Gibt es eine bessere Möglichkeit, das Ganze mit wenig plattformspezifischem Code zu erledigen?

Externe Bibliotheken kommen nicht in Frage, die Pflege von Abhängigkeiten ist jedoch problematisch, insbesondere auf mehreren Plattformen. Daher möchte ich Abhängigkeiten reduzieren. Ich habe solche Bibliothek im Auftrieb auch nicht gefunden.

Nur fürs Protokoll, was am Ende für mich funktioniert hat. Unter Windows / MSVCCreatePipe() + CreateProcess() wie beschriebenHiermit_open_osfhandle() gefolgt von_fdopen() bekommenFILE* zum Prozessein- und ausgang. Unter Linux / GCC ist hier nichts Neues zu erstellenpipe()s;fork() danndup2() die Rohre;exec(); fdopen() auf den entsprechenden Dateideskriptoren. Auf diese Weise ist nur der Prozess-Laichcode plattformabhängig (was in Ordnung ist, wie unter Windows, das ich zusätzlich steuern möchte)STARTUPINFO Parameter), das Schreiben und Lesen der Ausgabe erfolgt standardmäßigFILE* und verwandte Funktionen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage