前一篇大致講了一下epoll是個什么東西,優(yōu)點等內(nèi)容,這篇延續(xù)上一篇的內(nèi)容,主要是分析epoll的函數(shù),epoll高性能的深入分析。 epoll的三大函數(shù)1.創(chuàng)建epoll fd函數(shù) int epoll_create(int size); epoll_create()創(chuàng)建一個epoll的事例,通知內(nèi)核需要監(jiān)聽size個fd。size指的并不是最大的后備存儲設(shè)備,而是衡量內(nèi)核內(nèi)部結(jié)構(gòu)大小的一個提示。當(dāng)創(chuàng)建成功后,會占用一個fd,所以記得在使用完之后調(diào)用close(),否則fd可能會被耗盡。 Note:自從Linux2.6.8版本以后,size值其實是沒什么用的,不過要大于0,因為內(nèi)核可以動態(tài)的分配大小,所以不需要size這個提示了。 創(chuàng)建還有另外一個函數(shù) int epoll_create1(int flag); 這個函數(shù)是在linux 2.6.27中加入的,當(dāng)你在看陳碩的muduo時可以看到這個函數(shù),其實它和epoll_create差不多,不同的是epoll_create1函數(shù)的參數(shù)是flag,當(dāng)flag是0時,表示和epoll_create函數(shù)完全一樣,不需要size的提示了。 當(dāng)flag = EPOLL_CLOEXEC,創(chuàng)建的epfd會設(shè)置FD_CLOEXEC 當(dāng)flag = EPOLL_NONBLOCK,創(chuàng)建的epfd會設(shè)置為非阻塞 一般用法都是使用EPOLL_CLOEXEC. Note:關(guān)于FD_CLOEXEC,現(xiàn)在網(wǎng)上好多都說的有點問題,我翻閱了一些資料,請教了一些人,大約明白它的意思了。 它是fd的一個標(biāo)識說明,用來設(shè)置文件close-on-exec狀態(tài)的。當(dāng)close-on-exec狀態(tài)為0時,調(diào)用exec時,fd不會被關(guān)閉;狀態(tài)非零時則會被關(guān)閉,這樣做可以防止fd泄露給執(zhí)行exec后的進程。關(guān)于exec的用法,大家可以去自己查閱下,或者直接man exec。 2.epoll事件的注冊函數(shù) int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event); select是在監(jiān)聽時告訴內(nèi)核要監(jiān)聽的事件,而epoll_ctl是先注冊需要監(jiān)聽的事件。 第一個參數(shù)epfd,為epoll_create返回的的epoll fd。 第二個參數(shù)op表示操作值。有三個操作類型, EPOLL_CTL_ADD // 注冊目標(biāo)fd到epfd中,同時關(guān)聯(lián)內(nèi)部event到fd上 EPOLL_CTL_MOD // 修改已經(jīng)注冊到fd的監(jiān)聽事件 EPOLL_CTL_DEL // 從epfd中刪除/移除已注冊的fd,event可以被忽略,也可以為NULL 第三個參數(shù)fd表示需要監(jiān)聽的fd。 第四個參數(shù)event表示需要監(jiān)聽的事件。 typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ }; event參數(shù)是一個枚舉的集合,可以用” | “來增加事件類型,枚舉如下: EPOLLIN:表示關(guān)聯(lián)的fd可以進行讀操作了。 3.epoll等待事件函數(shù) int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 上面兩個函數(shù)的參數(shù)含義: 第一個參數(shù):表示epoll_wait等待epfd上的事件 第二個參數(shù):events指針攜帶有epoll_data_t數(shù)據(jù) 第三個參數(shù):maxevents告訴內(nèi)核events有多大,該值必須大于0 第四個參數(shù):timeout表示超時時間(單位:毫秒) epoll_pwait(since linux 2.6.19)允許一個應(yīng)用程序安全的等待,直到fd設(shè)備準(zhǔn)備就緒,或者捕獲到一個信號量。其中sigmask表示要捕獲的信號量。 函數(shù)如果等待成功,則返回fd的數(shù)字;0表示等待fd超時,其他錯誤號請查看errno 函數(shù)到這里就講完了,下一篇會寫一個例子給大家看下這些函數(shù)是如何使用的。 轉(zhuǎn)載請注明:C++愛好者博客 ? 淺析epoll – epoll函數(shù)深入講解 |
|