9

Boost.Log は fork() をサポートしていません。これは信じられないことですが、チケットのコメントに回避策が記載されています。

[..]したがって、今のところ、フォーク時にライブラリを再初期化するのはユーザー次第です。このような再初期化を行うには、pthread_atfork を使用できます。

したがって、私の質問: fork() の後に Boost.Log を正確に再初期化するにはどうすればよいですか?

コード例は大歓迎です。

4

1 に答える 1

1

すべてのシンクを処理し、子pthread_atforkプロセスのハンドラーでそれらを再作成する必要があります。つまり、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);

fork壊れたログシンクだけでなく、より多くのものを残す可能性があることに注意してください。マルチスレッドにforkは絶対に近づかないでください (pthread ライブラリが fork のハンドラーを提供するのは皮肉なことですが、スレッドがある場合はこれを避けたいと考えています ...)。

于 2015-09-15T18:39:02.767 に答える