2

epoll では、epoll_data 構造が重要です

    typedef union epoll_data {
        void *ptr;
        int fd;
        __uint32_t u32;
        __uint64_t u64;
    } epoll_data_t;

イベントによっては、それをいくつかの追加情報に関連付ける必要がある場合、epoll_data については、構造体を構築し、ptrその構造体を指すために を使用する必要があります。fdそして、構造の中に次のような要素を入れました

           typedef {
              int fd;
              char* info;
           } compound;

しかし、アクティブなイベントを確認したいときは、次のようにする必要があります。

for( ; ; )
    {
        nfds = epoll_wait(epfd,events,20,500);
        for(i=0;i<nfds;++i)
        {
            if(events[i].data.fd==listenfd) {
                ...
            }
            else if( ((compound*)events[i].events.ptr)->fd ....){
               ...
            }
    }

チェックに一貫性がありません。events[i].data.fdチェックする必要がある場合もあれば、チェックする必要がある場合もありevents[i].data.ptr->fdます。すべてのイベントに一貫性を持たせる、つまりすべてのイベントに void ptr を持たせると、一部のソケットについては、追加情報に関係がないため無駄になります。

epoll_dataは通常非常に重要なint fdので、独立した要素を持つべきだと思います。fd

これについてどう思いますか。ありがとう!

4

1 に答える 1

1

インスタンスに格納されたファイル記述子をいつでも使用epoll_dataして、独自のデータ配列/ハッシュにインデックス/キーを付けることができます。または、常にその共用体のポインター メンバーを使用して、すべてのメタデータをカスタム データ構造に含めることができます。つまり、すでに一貫性を保つことができます。

私の意見では、最小限の OS インターフェイスが望ましいです。

于 2013-05-20T17:49:00.000 に答える