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

max*_*zig 8 c++ logging boost fork boost-log

Boost.Log不支持fork().这有点令人难以置信,但机票评论描述了一种解决方法:

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

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

代码示例非常感谢.

小智 1

您必须处理所有接收器,并在pthread_atforkprocess_ 的处理程序中重新创建它们。即or函数将 a 返回到接收器。重置它,然后再次初始化。add_console_logadd_file_logboost::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);
Run Code Online (Sandbox Code Playgroud)

小心,这fork可能会留下更多东西,而不仅仅是破损的原木水槽。无论如何都要远离多线程fork(具有讽刺意味的是,pthread 库提供了 fork 的处理程序,如果有线程,您希望避免这种情况......)。