Boost.Log does not support fork()。这有点令人难以置信,但ticket comment描述了一种解决方法:
[..]所以现在由用户在fork处重新初始化库。您可以使用pthread_atfork进行重新初始化。
因此我的问题是:如何在fork()之后重新初始化Boost.Log?
代码示例非常感谢。
答案 0 :(得分:1)
您必须处理所有接收器,并在子进程中的pthread_atfork
处理程序中重新创建它们。即add_console_log
或add_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提供了处理程序,
如果有线程,你想避免...)。