2013-08-31 15 views
8

Boost.Log does not support fork(). Questa è una specie di incredibile, ma un ticket comment descrive una soluzione:Come reinizializzare la libreria Boost Log sulla forcella?

[..] quindi per ora tocca agli utenti per reinizializzare la biblioteca al bivio. È possibile utilizzare pthread_atfork per eseguire tale reinizializzazione.

Quindi la mia domanda: in che modo rieseguire l'inizializzazione di Boost.Log dopo un fork()?

Esempio di codice molto apprezzato.

+0

hai trovato una soluzione per questo? Grazie. – marathon

+0

@marathon, sfortunatamente no, non l'ho fatto. – maxschlepzig

risposta

1

Devi occuparti di tutti i lavandini e ricrearli nell'handler pthread_atforknel processo figlio. Cioè le funzioni add_console_log o add_file_log restituiscono un boost::shared_ptr al sink. Resettalo e inizializza nuovamente .

... 
boost::shared_ptr< 
    sinks::synchronous_sink<sinks::text_ostream_backend> 
> console_sink = logging::add_console_log(); 
... 
void fork_child_handler(void) 
{ 
    console_sink = logging::add_console_log(); 
    return; 
} 

// in some global setup code of your application 
pthread_atfork(NULL /*prepare*/, 
       NULL /* parent */, 
       &fork_child_handler); 

Prendersi cura, che fork possono lasciare più cose dietro di appena rotto lavandino registro. Stare lontano da multi-threading e fork con tutti i mezzi (è un po 'ironico che libreria pthread fornisce il gestore per la forcella, che si desidera evitare se ci sono thread ...).

Problemi correlati