6

epoll着信データに関する通知を受け取るために使用しています。によって返されるすべてのイベントは、 (ソケット記述子)epoll_wait()からデータを読み取ることができることを示しているため、難しくはありません。epoll_event.data.fd

しかし、今は受信と送信の両方のタイプの通知を受け取りたいと思っています(ソケットは送信に使用できます)。しかし、私はそれを行うことができません:

  1. epoll_event.eventsによって返されるものepoll_wait()は、私が渡すのと同じepoll_ctl()です。したがって、両方EPOLLINEPOLLOUT私の場合は含まれています。
  2. また、1つのソケットをepoll(EPOLLINおよびEPOLLOUTイベントとして)2回追加しようとすると、が表示されますEEXIST

select()通知を受け取るたびに手動で呼び出すことなく、この問題を解決するにはどうすればよいですか?

4

2 に答える 2

6

man epoll_wait「イベントメンバーには、返されたイベントビットフィールドが含まれる」と明確に述べられています。したがって、侵入する場合はEPOLLIN | EPOLLOUTepoll_event.eventsソケットが読み取りと書き込みの両方の準備ができている必要があります。

ソケットの状態が変化したときにのみ通知を受け取りたい場合はEPOLLET、エッジトリガー操作に使用します。

于 2012-10-03T17:17:03.203 に答える
4

を使用して記述子を追加する場合は、マスクをepoll_ctlに設定します。eventsEPOLLIN | EPOLLOUT

を介して通知を受け取るepoll_waitと、返される通知をループして、とをチェックしEPOLLINますEPOLLOUT

擬似コード

int index, count;
count = epoll_wait(epfd, epoll_event, MAX_EVENTS, -1);
for (index = 0; index < count; ++index) {
  if (epoll_event[index].events & EPOLLIN) {
    // Ready for read
  }

  if (epoll_event[index].events & EPOLLOUT) {
    // Ready for write
  }
}

一部の人々EPOLLOUTは、送信バッファにデータが存在する場合にのみビットを設定します。エラーチェックは含めませんでした。

于 2012-10-03T17:26:04.117 に答える