7

Linux システム コールをいじっていて、 のいくつかの側面を見つけましたがepoll、それは私には明確ではありません。epollたとえば、インスタンスを作成します。

epollfd = epoll_create(50);

次に、50 個のファイル記述子をfor-loopに登録します。

for(i=0; i<50; i++){
    // open file "file-i".txt
    // construct epoll_event
    // register new file descriptor with epoll_ctl(epollfd, EPOLL_CTL_ADD ...

これで、アクションの準備が整った 50 個のファイルができました (読み取りか書き込みかは関係ありません)。MAX_EVENTS を 3 に設定します。

#define MAX_EVENTS 3
...
struct epoll_event events[MAX_EVENTS]
...
epoll_wait(epollfd, events, MAX_EVENTS, -1)

これらの 50 個のファイルはすべて準備ができていて、そのうちの 3 個だけを要求しました。どのファイルがevents配列になりますか?

  • [1,2,3] -- epoll に追加された順に最初の 3 つのファイル
  • [48,49,50] -- epoll に追加された順番での最後の 3 つのファイル
  • [34, 7, 15] -- ランダムな 3 つのファイル
  • その他のオプション

ありがとうございました。

4

1 に答える 1

8

のソース ファイルを熟読するepollと、準備完了イベントがリンクされたリストに保持されていることがわかります。イベントはリストの先頭から削除され、リストの最後に追加されます。

それに基づいて、答えは、記述子の順序は準備ができた順序に基づいているということです。

この動作は、次の注記に記載されていますepoll_wait

が呼び出されたときに複数のmaxeventsファイル記述子が準備されている場合epoll_wait() 、連続するepoll_wait()呼び出しでは、準備ができているファイル記述子のセットを丸めます。...

ドキュメントは@mtkのおかげです。

于 2013-10-01T11:05:08.913 に答える