• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

               C++ 技術中心

               :: 首頁 :: 聯(lián)系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

            鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評論

            評論排行榜

            epoll調(diào)用

            在linux的網(wǎng)絡編程中,很長的時間都在使用select來做事件觸發(fā)。在linux新的內(nèi)核中,有了一種替換它的機制,就是epoll。
            相比于select,epoll最大的好處在于它不會隨著監(jiān)聽fd數(shù)目的增長而降低效率。因為在內(nèi)核中的select實現(xiàn)中,它是采用輪詢來處理的,輪詢的fd數(shù)目越多,自然耗時越多。并且,在linux/posix_types.h頭文件有這樣的聲明:
            #define __FD_SETSIZE 1024
            表示select最多同時監(jiān)聽1024個fd,當然,可以通過修改頭文件再重編譯內(nèi)核來擴大這個數(shù)目,但這似乎并不治本。

            epoll的接口非常簡單,一共就三個函數(shù):
            1. int epoll_create(int size);
            創(chuàng)建一個epoll的句柄,size用來告訴內(nèi)核這個監(jiān)聽的數(shù)目一共有多大。這個參數(shù)不同于select()中的第一個參數(shù),給出最大監(jiān)聽的fd+1的值。需要注意的是,當創(chuàng)建好epoll句柄后,它就是會占用一個fd值,在linux下如果查看/proc/進程id/fd/,是能夠看到這個fd的,所以在使用完epoll后,必須調(diào)用close()關閉,否則可能導致fd被耗盡。


            2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
            epoll的事件注冊函數(shù),它不同與select()是在監(jiān)聽事件時告訴內(nèi)核要監(jiān)聽什么類型的事件,而是在這里先注冊要監(jiān)聽的事件類型。第一個參數(shù)是epoll_create()的返回值,第二個參數(shù)表示動作,用三個宏來表示:
            EPOLL_CTL_ADD:注冊新的fd到epfd中;
            EPOLL_CTL_MOD:修改已經(jīng)注冊的fd的監(jiān)聽事件;
            EPOLL_CTL_DEL:從epfd中刪除一個fd;
            第三個參數(shù)是需要監(jiān)聽的fd,第四個參數(shù)是告訴內(nèi)核需要監(jiān)聽什么事,struct epoll_event結(jié)構(gòu)如下:
            struct epoll_event {
            __uint32_t events; /* Epoll events */
            epoll_data_t data; /* User data variable */
            };

            events可以是以下幾個宏的集合:
            EPOLLIN :表示對應的文件描述符可以讀(包括對端SOCKET正常關閉);
            EPOLLOUT:表示對應的文件描述符可以寫;
            EPOLLPRI:表示對應的文件描述符有緊急的數(shù)據(jù)可讀(這里應該表示有帶外數(shù)據(jù)到來);
            EPOLLERR:表示對應的文件描述符發(fā)生錯誤;
            EPOLLHUP:表示對應的文件描述符被掛斷;
            EPOLLET: 將EPOLL設為邊緣觸發(fā)(Edge Triggered)模式,這是相對于水平觸發(fā)(Level Triggered)來說的。
            EPOLLONESHOT:只監(jiān)聽一次事件,當監(jiān)聽完這次事件之后,如果還需要繼續(xù)監(jiān)聽這個socket的話,需要再次把這個socket加入到EPOLL隊列里


            3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
            等待事件的產(chǎn)生,類似于select()調(diào)用。參數(shù)events用來返回從內(nèi)核得到事件的集合,maxevents告之內(nèi)核這個events有多大,這個maxevents的值不能大于創(chuàng)建epoll_create()時的size,參數(shù)timeout是超時時間(毫秒,0會立即返回,-1將不確定,也有說法說是永久阻塞)。該函數(shù)返回需要處理的事件數(shù)目,如返回0表示已超時。

            使用epoll的注意事項
            1. ET模式比LT模式高效,但比較難控制。
            2. 如果某個句柄期待的事件不變,不需要EPOLL_CTL_MOD,但每次讀寫后將該句柄modify一次有助于提高穩(wěn)定性,特別在ET模式。
            3. socket關閉后最好將該句柄從epoll中delete(EPOLL_CTL_DEL),雖然epoll自身有處理,但會使epoll的hash的節(jié)點數(shù)增多,影響搜索hash的速度。
            posted on 2013-07-01 14:35 C++技術中心 閱讀(1488) 評論(0)  編輯 收藏 引用 所屬分類: Linux 編程
            久久66热人妻偷产精品9| 人人狠狠综合久久亚洲婷婷| 国产呻吟久久久久久久92| 香蕉99久久国产综合精品宅男自| 欧美成人免费观看久久| 久久99中文字幕久久| 久久亚洲2019中文字幕| 麻豆一区二区99久久久久| 久久久久久A亚洲欧洲AV冫| 久久婷婷五月综合97色| 久久男人AV资源网站| 99久久99这里只有免费的精品| 99热成人精品免费久久| 97久久婷婷五月综合色d啪蜜芽| 青青草原综合久久| 久久久精品国产sm调教网站| 久久这里只有精品首页| 国产激情久久久久影院小草| 久久久久女人精品毛片| 亚洲国产精品成人AV无码久久综合影院| 久久久久亚洲精品天堂| 久久久久高潮综合影院| 久久婷婷人人澡人人| 91精品无码久久久久久五月天| 久久久久久久女国产乱让韩| 久久久久国产精品麻豆AR影院 | 久久精品人人做人人爽电影蜜月| 久久伊人影视| 亚洲精品tv久久久久| 久久久免费观成人影院| 精品免费久久久久国产一区| 91久久精一区二区三区大全| 久久亚洲AV成人无码电影| 国产aⅴ激情无码久久| 久久综合偷偷噜噜噜色| 亚洲精品第一综合99久久| 老司机午夜网站国内精品久久久久久久久| 四虎国产精品免费久久久 | 国产精品午夜久久| 国产福利电影一区二区三区,免费久久久久久久精 | 久久se精品一区二区影院|