3

epoll_wait() が、(epoll_ctl() を使用して) 登録されたソケットが読み取り/書き込みの準備ができているというイベントを受け取る方法に興味があります。

私は glibc が魔法のようにそれを処理すると信じています。

次に、ソケットに対して次のイベントをトリガーする方法を説明したドキュメントはありますか?

  1. エポルプリ
  2. EPOLLRDNORM
  3. EPOLLRDBAND
  4. EPOLLWRNORM
  5. エポールバンド
  6. EPOLLMSG
  7. エポラー
  8. エポルハップ
  9. EPOLLRDUP

PS もともと、ここのボックスの sys/epoll.h に列挙型 EPOLL_EVENTS を貼り付けようとしていました。スタックオーバーフローは、コードブロックを pre でラップしてからコードタグでラップしたにもかかわらず、コードブロックを正しくフォーマットしていないと考えています。

4

2 に答える 2

10

ドキュメントに関する最も明白な問題は、イベントが実際には(2) イベントと完全に同一であることをepoll「太字」で述べていないことです。実際、カーネル側では、古いイベント名の観点からイベントを処理します。epollpollepollpoll

#define POLLIN     0x0001  // EPOLLIN
#define POLLPRI    0x0002  // EPOLLPRI
#define POLLOUT    0x0004  // EPOLLOUT
#define POLLERR    0x0008  // EPOLLERR
#define POLLHUP    0x0010  // EPOLLHUP
#define POLLNVAL   0x0020  // unused in epoll
#define POLLRDNORM 0x0040  // EPOLLRDNORM
#define POLLRDBAND 0x0080  // EPOLLRDBAND
#define POLLWRNORM 0x0100  // EPOLLWRNORM
#define POLLWRBAND 0x0200  // EPOLLWRBAND
#define POLLMSG    0x0400  // EPOLLMSG
#define POLLREMOVE 0x1000  // unused in epoll
#define POLLRDHUP  0x2000  // EPOLLRDHUP

次に、カーネル ソースを簡単に調べると、次のことがわかります。

  • EPOLLINEPOLLRDNORM同一です (EPOLLIN | EPOLLRDNORMファイル記述子からデータを読み取ることができる場合、epoll は戻ります)。

  • EPOLLOUTEPOLLWRNORM同一です (EPOLLOUT | EPOLLWRNORMバッファ領域が書き込み可能になると、epoll は戻ります)。

  • EPOLLRDBAND記述子の帯域外データの可用性を通知します (一部のソケットでは、これはソケットに渡されたフラグEPOLLWRBAND付きのデータ送信になります)。MSG_OOB

  • EPOLLPRI修飾フラグであり、常に他のイベント ( などEPOLLERR) を補強します。関連するファイル記述子が提供する目的に応じて、多少異なることを意味する可能性があるため、その使用はサブシステムに依存します。

  • EPOLLMSGカーネルによって使用されていないようで、何の役にも立たないようです。

  • EPOLLRDHUPピアが読み取りのためにチャネルの側を閉じたが、まだデータを受信する可能性があることを通知します (これ以上要求データが入っていないことを確認するのに便利です)。

  • EPOLLHUPピアがチャネルの側を閉じたことを通知します。

于 2014-11-26T07:43:32.763 に答える
2

重要な作業はすべてepollカーネルで行われ、ユーザー空間 API は単なるインターフェースです。ePoll が Poll よりも正確にスケールするのはなぜですか? に関する前のスレッド カーネルがどのように実装するかについての詳細をカバーしていますepoll

イベントとそれらがどのようにトリガーされるかを説明するドキュメントについては、epoll_ctl(2) man page各イベントをカバーしています。たとえば、次のとおりです。

EPOLLIN
          The associated file is available for read(2) operations.

EPOLLOUT
          The associated file is available for write(2) operations.

のより良い説明については、EPOLLETを読む必要がありますepoll(7) man page

これはepoll の使用方法の完全な例です

を使用epoll_ctlして、イベントを受け取りたいイベントをリクエストするEPOLLINEPOLLET、上記のコードは次のようになります。

event.events = EPOLLIN | EPOLLET;
s = epoll_ctl (efd, EPOLL_CTL_ADD, infd, &event);
于 2013-08-07T22:09:07.167 に答える