0

私は学んでいlibevます。ev_default_forkしかし、私はの旗について理解していませんev_loop。これは、実行に近い問題ですか?旗のようにFD_CLOEXEC fcntl()?フラグを設定する必要があるときは?このフラグが必要なのはどちらの場合ですか?これはドキュメントの説明です:

この関数は、後続のev_loop反復で、カーネル状態が1つあるバックエンドのカーネル状態を再初期化するフラグを設定します。名前にもかかわらず、いつでも呼び出すことができますが、子プロセス(または子と親の両方)でforkした後、最も意味がありますが、これもほとんど意味がありません。libevfunctionを使用する前に、子で呼び出す必要があります。これは、次のev_loopの反復でのみ有効になります。

一方、子でイベントライブラリを使用する場合にのみ、子プロセスでこの関数を呼び出す必要があります。fork + execだけの場合は、呼び出す必要はまったくありません。

関数自体は非常に高速であり、フォークの後で念のために呼び出すことは通常問題ではありません。これを簡単にするために、関数はpthread_atforkの呼び出しに完全に適合します。pthread_atfork(0、0、ev_default_fork);

4

1 に答える 1

2

ドキュメントを読んでfork()ください。できれば最初に実行した後、子の関数を呼び出します。したがって、コードは次のようになります。

switch (fork()) {
case -1:
    /* everything's gone pear-shaped */

default:
    /* i am the parent */
    ...
    break;

case 0:
    /* i am the child */
    ev_loop_fork(EV_DEFAULT);
    ...
    break;
}
于 2012-08-01T12:08:25.403 に答える