読めるように複数のファイル記述子を用いepoll_selectとEPOLLET?
質問
男epoll:
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.
想像してつfd:最初は受動データのみものが活躍し、データのみがございません。
epoll_wait返されることを読み解きます。また読み{により第二}のループ(電話epoll_waitでのような場合には突然のブロックのデータが残ります。
現在のファイル記述子を返EAGAINに読み出します。
どうする?
- ま読みのfdループ(電話epoll_wait)まで見逃されるデータの可能性があることを踏まえると最初のfd.まだ読みを読み、読みずEAGAIN.
- また"相談"とepoll_wait前からの読み込みのfd epoll_waitが突然ブロックで何も変わら前回の通話データが入手可能となっていないのFDとが可能にFD)です。
どのよう継続加工にFDが忘れな最初のFD?
更新: 見つかったりもの:男epoll_wait:
while specifying timeout equal to zero makes epoll_wait() to return immediately even if no events are available
ここまで列挙のイベントのためのFdの場合もありません。
解決
FD2は常に読み取り可能な場合は、
あなたはそのファイルディスクリプタがそれに適していない考えるかもしれません。それはちょうどそれを座って読むためのスレッドスピンオフ価値があるかもしれません。
それ以外の場合は、それが排出されるまでループでFD2を読むが、ループの中で、それが通じ、すべてのX時間後にFD1を読み込もうとしています。 FD1にデータがある場合は、それを読んで。ない場合は、単にEAGAINは、Xカウンタをリセットし、FD2を読みに戻って取得します。両方が排出されている場合、あなたはイベントがepoll_waitに戻ってます。
のような何かます:
count = 1;
while (true)
{
read fd2;
if (EAGAIN)
break;
else
process data;
count--;
if (! count)
{
while (true)
{
read fd1;
if (EAGAIN)
count = 10;
break;
else
process data;
}
}
}
所属していません StackOverflow