如何在fork上重新初始化Boost日志库?

时间:2013-08-31 16:04:28

标签: c++ logging boost fork boost-log

Boost.Log does not support fork()。这有点令人难以置信,但ticket comment描述了一种解决方法:

  

[..]所以现在由用户在fork处重新初始化库。您可以使用pthread_atfork进行重新初始化。

因此我的问题是:如何在fork()之后重新初始化Boost.Log?

代码示例非常感谢。

1 个答案:

答案 0 :(得分:1)

您必须处理所有接收器,并在子进程中的pthread_atfork处理程序中重新创建它们。即add_console_logadd_file_log函数会将boost::shared_ptr返回到接收器。重置,并初始化 它再次。

...
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);

请注意,fork可能会留下更多的东西,而不仅仅是破碎 原木水槽。一定要远离多线程和fork (有点讽刺的是,pthread库为fork提供了处理程序,  如果有线程,你想避免...)。