Vra

Ek wikkel bestaande C ++ kode van 'n BSD projek in ons eie persoonlike wrapper en ek wil dit te integreer om ons kode met so min as moontlik verander. Hierdie kode gebruik fprintf te druk om stderr om te kan inteken / verslag foute.

Ek wil hierdie lei na 'n alternatiewe plek binne dieselfde proses. Op Unix Ek het dit met 'n socketpair en 'n thread gedoen: die een kant van die aansluiting is waar ek stuur stderr (via 'n oproep om dup2) en die ander kant word gemonitor in 'n draad, waar ek dan die uitset kan verwerk.

Dit werk nie op Windows maar omdat 'n potjie is nie dieselfde as 'n lêer te hanteer.

Alle dokumente Ek het op die web gevind wys hoe om uitset te lei van 'n kind proses, wat nie is wat ek wil. Hoe kan ek lei stderr in dieselfde proses om 'n terugbel van een of ander aard toe uitset is nie? (En voor jy so sê, het ek probeer SetStdHandle maar kan enige manier om dit te laat werk nie vind) ...

Was dit nuttig?

Oplossing

Jy kan 'n soortgelyke tegniek op Windows te gebruik, moet jy net om verskillende woorde gebruik vir dieselfde begrippe. :) Hierdie artikel: http://msdn.microsoft.com/en-us/ biblioteek / ms682499.aspx gebruik 'n Win32 pyp te hanteer I / O van 'n ander proses, jy moet net dieselfde ding doen met drade binne dieselfde proses. Natuurlik, in jou geval al uitset na stderr vanaf enige plek in die proses sal herlei word na jou verbruiker.

Eintlik ander stukke van die legkaart wat jy mag nodig is _fdopen en _open_osfhandle . Trouens, hier is 'n verwante voorbeeld van 'n paar kode ek jare gelede vrygestel:

DWORD CALLBACK DoDebugThread(void *)
{
    AllocConsole();
    SetConsoleTitle("Copilot Debugger");
    // The following is a really disgusting hack to make stdin and stdout attach
    // to the newly created console using the MSVC++ libraries. I hope other
    // operating systems don't need this kind of kludge.. :)
    stdout->_file = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
    stdin->_file  = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT);
    debug();
    stdout->_file = -1;
    stdin->_file  = -1;
    FreeConsole();
    CPU_run();
    return 0;
}   

In hierdie geval, die belangrikste proses was 'n GUI proses wat nie begin met Wiskunde Streek Leuven B. hanteer nie. Dit maak 'n konsole, dan stoot die reg hanteer in stdout en stdin so die funksie debug () (wat is ontwerp as 'n Wiskunde Streek Leuven B. interaktiewe funksie) kan interaksie met die nuutgeskepte konsole. Jy moet in staat wees om 'n paar pype oop en doen dieselfde soort ding om stderr lei.

Ander wenke

Jy moet onthou dat dit wat MSVCRT noem "OS hanteer" is nie Win32 hanteer, maar nog 'n laag van handvatsels bygevoeg net om jou te verwar. MSVCRT probeer om die Unix handvatsel nommers waar stdin = 0, stdout = 1, stderr = 2 en so aan te boots. Win32 handvatsels word verskillend getel en hul waardes altyd gebeur met 'n veelvoud van 4. Die opening van die pyp en kry al die handvatsels behoorlik gekonfigureer sal vereis om jou hande vuil te wees. Die gebruik van die MSVCRT bronkode en 'n debugger is waarskynlik 'n vereiste.

Jy noem dat jy nie wil hê om 'n naam van pyp vir interne gebruik gebruik; dit is waarskynlik die moeite werd poining daarop dat die dokumentasie vir CreatePipe () state, "Anonymous pype geïmplementeer met behulp van 'n naam van pyp met 'n unieke naam. Daarom, jy kan dikwels slaag 'n handvatsel aan 'n anonieme pyp om 'n funksie wat 'n handvatsel aan 'n naam van pyp vereis. ' So, ek stel voor dat jy net skryf 'n funksie wat 'n soortgelyke pyp skep met die regte gereedskap vir asinkroniseer lees. Ek is geneig om 'n GUID gebruik as 'n string (gegenereer met behulp van CoCreateGUID() en StringFromIID()) vir my 'n unieke naam gee en dan skep die bediener en die kliënt eindig van die naam van pyp met die regte gereedskap vir oorvleuel I / O (meer besonderhede oor hierdie en kode, hier: http: // www.lenholgate.com/blog/2008/02/process-management-using-jobs-on-windows.html ).

Wanneer ek dat ek bedraad 'n paar kode wat Ek moet 'n lêer met oorvleuel I / O met 'n B te lees / O Voltooiing Port en, wel, dan kry ek net asinkroniseer kennisgewings van die data as dit kom ... Maar Ek het 'n redelike mate van goed getoets biblioteek kode het in daar wat maak dit al gebeur ...

Dit is waarskynlik moontlik om die opstel van die naam van pyp en dan net doen 'n oorvleuel lees met 'n gebeurtenis in jou OVERLAPPED struktuur en maak seker die geleentheid om te sien of data beskikbaar was ... Ek het nie kode beskikbaar wat doen wat al is.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top