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
これについてどう思いますか。ありがとう!