Przekierowanie międzyplatformowe standardowego wejścia i wyjścia procesu spawnowanego w natywnym C / C ++ (edycja z rozwiązaniem)

Mam polecenie łańcuchowe, które chciałbym wykonać asynchronicznie podczas zapisywania na jego wejściu i odczytu jego danych wyjściowych. Brzmi prosto, diabeł jest na wieloplatformowym. Mam na celu zarówno MSVC / Win32, jak i gcc / Linux i oczywiście chcę napisać minimalną ilość kodu specyficznego dla platformy. Moje google-fu zawiodło mnie, mam za dużo hałasu dla moich zapytań, więc zacząłem od tego, co wiem.

popen - Łatwo i przyjemnie, zwraca PLIK *, który łatwo jest konsumować wszędzie. Ale oto coMSDN musi powiedzieć o _popen:

Funkcja _popen używana w programie Windows zwraca niepoprawny wskaźnik pliku, który powoduje, że program przestaje odpowiadać w nieskończoność. _popen działa poprawnie w aplikacji konsoli. Aby utworzyć aplikację Windows przekierowującą dane wejściowe i wyjściowe, zobacz Tworzenie procesu potomnego z przekierowanym wejściem i wyjściem w zestawie SDK platformy.

i dlatego popen nie wchodzi w rachubę (edytuj: ponieważ chciałbym, aby mój kod działał w aplikacji GUI). Sposób na Windows to moim zdaniem raczej brzydki i gadatliwy. Mogłem żyć z kodem odradzania specyficznym dla platformy, ale chciałbym, aby przynajmniej kod I / O był taki sam. Tutaj jednak trafiłem na ścianę między WinAPIHANDLEs i CFILE*, iint deskryptor pliku. Czy istnieje sposób na „przekonwertowanie” aHANDLE doFILE* lubint fd lub odwrotnie? (Google zawiodło mnie jeszcze raz w tej sprawie, wszystkie słowa kluczowe, które próbowałem, są nadużywane)

Czy jest lepszy sposób na zrobienie całości z małym kodem specyficznym dla platformy?

Biblioteki zewnętrzne nie są wykluczone, jednak utrzymanie zależności to ból, szczególnie na wielu platformach, więc chciałbym zmniejszyć zależności. Nie znalazłem też takiej biblioteki.

Dla porządku, co w końcu mi się udało. W systemie Windows / MSVC,CreatePipe() + CreateProcess() jak opisanotutaj, za pomocą_open_osfhandle() śledzony przez_fdopen() zdobyćFILE* do wejścia i wyjścia procesu. W Linuksie / GCC, nic nowego tutaj, tworzeniepipe()s;fork() następniedup2() rury;exec(); fdopen() na odpowiednich deskryptorach plików. W ten sposób tylko kod odradzania procesu jest zależny od platformy (co jest w porządku, jak w systemie Windows chciałbym kontrolować dodatkoweSTARTUPINFO parametry), zapisywanie danych wejściowych i odczyt danych wyjściowych odbywa się przez standardFILE* i powiązane funkcje.

questionAnswers(2)

yourAnswerToTheQuestion