男エポール:
The suggested way to use epoll as an edge-triggered (EPOLLET) interface is as follows:
i with nonblocking file descriptors; and
ii by waiting for an event only after read(2) or write(2) return EAGAIN.
2つのfdsがあるとします。1つはパッシブで、データはたまにしか利用できません。2つ目はアクティブで、データはたまにしか利用できません。
epoll_waitは、両方を読み取ることができることを返しました。ループ内で{最初の}を読み取ります(データがまだ利用可能である間に突然ブロックされる可能性があるため、epoll_waitを呼び出さずに)。
これで、最初のファイル記述子が読み取り時にEAGAINを返しました。
何をすべきか?
- (epoll_waitを呼び出さずに)ループ内の2番目のfdを読み取り続けると、最初のfdでデータが使用可能になったことを見逃す可能性があります。EAGAINなしで読み取り、読み取り、読み取りを行います。
- 2番目のfdから読み取るたびにepoll_waitに「相談」すると、前の呼び出しから何も変更されていないため、epoll_waitが突然ブロックされる可能性があります(データは最初のFDでまだ利用できず、2番目のFDでも利用できます)。
最初のFDを忘れずに、2番目のFDの処理を続行するにはどうすればよいですか?
更新:もう1つ見つかりました:man epoll_wait:
while specifying timeout equal to zero makes epoll_wait() to return immediately even if no events are available
これにより、イベントがない場合でもFDのイベントを列挙できます。