歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux epoll使用例子

Linux epoll使用例子

日期:2017/3/1 9:44:25   编辑:Linux編程

Linux epoll的使用:

#include <sys/epoll.h>

int epoll_create(int size);

int epoll_create1(int flags);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

epoll與select、poll的區別:

相比於select與poll,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。

內核中的select與poll的實現是采用輪詢來處理的,輪詢的fd數目越多,自然耗時越多。

epoll的實現是基於回調的,如果fd有期望的事件發生就通過回調函數將其加入epoll就緒隊列中,也就是說它只關心“活躍”的fd,與fd數目無關。

內核 / 用戶空間 內存拷貝問題,如何讓內核把 fd消息通知給用戶空間呢?在這個問題上select/poll采取了內存拷貝方法。而epoll采用了共享內存的方式。

epoll不僅會告訴應用程序有I/0 事件到來,還會告訴應用程序相關的信息,這些信息是應用程序填充的,因此根據這些信息應用程序就能直接定位到事件,而不必遍歷整個fd集合

EPOLLLT:

完全靠kernel epoll驅動,應用程序只需要處理從epoll_wait返回的fds,這些fds我們認為它們處於就緒狀態。

EPOLLET:

此模式下,系統僅僅通知應用程序哪些fds變成了就緒狀態,一旦fd變成就緒狀態,epoll將不再關注這個fd的任何狀態信息,(從epoll隊列移除)直到應用程序通過讀寫操作觸發EAGAIN狀態,epoll認為這個fd又變為空閒狀態,那麼epoll又重新關注這個fd的狀態變化(重新加入epoll隊列)。

隨著epoll_wait的返回,隊列中的fds是在減少的,所以在大並發的系統中,EPOLLET更有優勢。但是對程序員的要求也更高。

Linux通過改進的epoll實現對不同超時時間的數據包重傳 http://www.linuxidc.com/Linux/2014-05/101333.htm

使用epoll+時間堆實現高性能定時器 http://www.linuxidc.com/Linux/2014-05/101332.htm

select/poll/epoll 對比 http://www.linuxidc.com/Linux/2014-03/97444.htm

使用epoll 在 Linux 上開發高性能應用服務器 http://www.linuxidc.com/Linux/2013-09/90253.htm

Linux網絡編程中的pol和epolll函數總結 http://www.linuxidc.com/Linux/2013-09/89932.htm

Copyright © Linux教程網 All Rights Reserved