關於epoll_wait返回值的一個簡單測試
void test(int epollfd)
{
struct epoll_event events[MAX_EVENT_NUMBER];
int number;
while (1)
{
number = epoll_wait(epollfd, events, MAX_EVENT_NUMBER, -1);
printf("number : %2d\n\n", number);
for (i = 0; i < number; i++)
{
sockfd = events[i].data.fd;
if (sockfd == listenfd)
{/*用戶上線*/
}
else if (events[i].events & EPOLLIN)
{/*有數據可讀*/
}
else if (events[i].events & EPOLLOUT)
{/*有數據可寫*/
}
else
{/*出錯*/
}
}
}
}
通過測試發現epoll_wait返回值number是不會大於MAX_EVENT_NUMBER的。
測試過程中,連接的客戶端數遠大於MAX_EVENT_NUMBER,由此可以推論:epoll_wait()每次返回的是活躍客戶端的個數,每次並將這些活躍的客戶端信息加入到events[MAX_EVENT_NUMBER]。
由此可見,活躍客戶端的個數相同的情況下,events[MAX_EVENT_NUMBER]越大,epoll_wait()函數執行次數越少,但是events[MAX_EVENT_NUMBER]越大越消耗存儲資源。
所以,MAX_EVENT_NUMBER的選擇應該在效率和資源間取一個平衡點。