• <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 編程
            久久99国产精品久久99果冻传媒| 伊人色综合九久久天天蜜桃| 蜜臀久久99精品久久久久久小说| 人妻丰满AV无码久久不卡| 国内精品久久久久久久97牛牛| 久久国产精品99精品国产987| 久久精品亚洲精品国产欧美| 亚洲精品乱码久久久久久久久久久久 | 久久香蕉超碰97国产精品| 精品久久无码中文字幕| 狠狠色综合久久久久尤物| 久久久久亚洲AV无码专区首JN| 精品国际久久久久999波多野| 久久人妻少妇嫩草AV蜜桃| 久久精品黄AA片一区二区三区| 久久久久国产精品麻豆AR影院| 久久精品黄AA片一区二区三区| 亚洲欧美国产精品专区久久| 欧美一区二区精品久久| 久久青青草原亚洲av无码app| 青青热久久国产久精品| 国产一久久香蕉国产线看观看| 国产亚洲美女精品久久久2020| 麻豆久久| 久久精品国产一区二区三区不卡| 91精品国产高清91久久久久久| 成人综合久久精品色婷婷| 午夜视频久久久久一区| 99久久亚洲综合精品成人| 人人狠狠综合久久亚洲88| av午夜福利一片免费看久久| 中文国产成人精品久久不卡| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | A级毛片无码久久精品免费 | 一本色道久久99一综合| 久久午夜无码鲁丝片秋霞| 热久久视久久精品18| 亚洲中文字幕无码久久2017| 国产偷久久久精品专区 | 狠狠精品久久久无码中文字幕| 精品久久久久中文字幕一区|