3

男エポール:

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を返しました。

何をすべきか?

  1. (epoll_waitを呼び出さずに)ループ内の2番目のfdを読み取り続けると、最初のfdでデータが使用可能になったことを見逃す可能性があります。EAGAINなしで読み取り、読み取り、読み取りを行います。
  2. 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のイベントを列挙できます。

4

1 に答える 1

1

FD2が常に読み取り可能である場合は、epollが適切ではないと考えるかもしれません。座って読むためだけにスレッドをスピンオフする価値があるかもしれません。

それ以外の場合は、FD2が排出されるまでループで読み取りますが、ループではX回ごとに1回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;
       }
   }
}
于 2010-10-24T04:44:42.373 に答える