10

マルチスレッドの Linux-2.6.32+ アプリケーションを書き直して、 に置き換えselectていepollます。

epoll_create1(2)の man ページでは、次のように宣言されています。

flags が 0 の場合、廃止された size 引数が削除されるという事実を除けば、epoll_create1() は epoll_create() と同じです。

しかし、この時代遅れのサイズ引数epoll_wait(2)はasで使用されていmaxeventsませんか?

epoll_wait(int epfd, struct epoll_event *events,
                  int maxevents, int timeout);

これは、epoll を使用する場合、イベントの最大数を宣言することを避けることができますがepoll_create1、遅かれ早かれepoll_wait?を呼び出すときにそれを参照する必要があることを意味します。epoll_create1もしそうなら、ゲームに持ち込むポイントは何ですか?

この件について教えてくれてありがとう。

4

2 に答える 2

11

epoll_wait()は、返さmaxeventsれるイベントの最大数を示します。カーネル内で維持される数とは関係ありません。

の古いバージョンでepoll_create()は、サイズを使用して特定の制限を設定していましたが、それは行われなくなったため、size引数が廃止されたというコメントです。これは、ソースコードによって明らかにされています(fs/eventpoll.cこの回答の時点で):

SYSCALL_DEFINE1(epoll_create1, int, flags) {
    return do_epoll_create(flags);
}
SYSCALL_DEFINE1(epoll_create, int, size) {
    if (size <= 0) return -EINVAL;
    return do_epoll_create(0);
}

次の点を除いて、ほとんど同じであることがわかります。

  • epoll_create1()フラグを受け取り、 に渡しますdo_epoll_create()
  • epoll_create()サイズを受け入れてチェックしますが、それ以外は無視します。
  • epoll_create()デフォルトのフラグ (なし) を に渡しますdo_epoll_create()

したがって、使用の利点はepoll_create1()、フラグを指定できることです。これは、現在、実行時にクローズに制限されていると思います(exec別のプログラムを実行すると、ファイル記述子が自動的に閉じられるように)。

于 2012-04-04T12:44:19.153 に答える
2

epoll_create1()フラグを設定する方法を提供します。ここでサイズを設定する必要はありません。

実際にはカーネル ソース コード内: /fs/eventpoll.c

SYSCALL_DEFINE1(epoll_create, int, size)
{
    if (size <= 0)
        return -EINVAL;

    return sys_epoll_create1(0);
}

epoll_wait()パラメータは、構造体max_events全体の合計 fd カウントではなく、戻り fd カウントを制御するためのものですeventpoll

于 2012-04-04T12:52:07.650 に答える