1. 程式人生 > >永遠在跟隨,從未去超越

永遠在跟隨,從未去超越

        epoll的工作原理是,你如果想進行IO操作時,先向epoll查詢是否可讀或可寫,如果處於可讀或可寫狀態後,epoll會通過epoll_wait函式通知你,此時你再進行進一步的recv或send操作。         epoll僅僅是一個非同步事件的通知機制,其本身並不作任何的IO讀寫操作,它只負責告訴你是不是可以讀或可以寫了,而具體的讀寫操作,還要應用層自己來作。epoll僅提供這種機制也是非常好的,它保持了事件通知與IO操作之間彼此的獨立性,使得epoll的使用更加靈活。 epoll用到的所有函式都是在標頭檔案sys/epoll.h中宣告的,下面簡要說明所用到的資料結構和函式:
所用到的資料結構
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 */
        };
結構體epoll_event 被用於註冊所感興趣的事件和回傳所發生待處理的事件,     epoll_data 聯合體用來儲存觸發事件的某個檔案描述符相關的資料,例如一個client連線到伺服器,伺服器通過呼叫accept函式可以得到與這個client對應的socket檔案描述符,可以把這檔案描述符賦給epoll_data的fd欄位以便後面的讀寫操作在這個檔案描述符上進行       a、*ptr: 通過指標ptr攜帶應用層資料, 當事件的通知到來時,它不僅告訴你發生了什麼樣的事件,還同時告訴這次事件所操作的資料是哪些          epoll_event 結構體的events欄位是表示感興趣的事件和被觸發的事件可能的取值為:       EPOLLIN
:表示對應的檔案描述符可以讀;
      EPOLLOUT:表示對應的檔案描述符可以寫;
      EPOLLPRI:表示對應的檔案描述符有緊急的資料可讀(這裡應該表示有帶外資料到來);
      EPOLLERR:表示對應的檔案描述符發生錯誤;
      EPOLLHUP:表示對應的檔案描述符被結束通話;
      EPOLLET:表示對應的檔案描述符有事件發生; 所用到的函式:
1、epoll_create函式
     函式宣告:int epoll_create(int size)
    該函式生成一個epoll專用的檔案描述符,其中的引數是指定生成描述符的最大範圍 2、epoll_ctl函式
     函式宣告:int epoll_ctl(int
epfd, int op, int fd, struct epoll_event *event)
    
該函式用於控制某個檔案描述符上的事件,可以註冊事件,修改事件,刪除事件。
    引數: epfd:由 epoll_create 生成的epoll專用的檔案描述符;
               op:要進行的操作例如註冊事件,可能的取值EPOLL_CTL_ADD 註冊、EPOLL_CTL_MOD
                        改、EPOLL_CTL_DEL 刪除
                fd:關聯的檔案描述符;
           event:指向epoll_event的指標;
    如果呼叫成功返回0,不成功返回-1
3、epoll_wait函式
函式宣告:int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)
該函式用於輪詢I/O事件的發生;
引數:
epfd:由epoll_create 生成的epoll專用的檔案描述符;
epoll_event:用於回傳代處理事件的陣列;
maxevents:每次能處理的事件數;
timeout:等待I/O事件發生的超時值;
返回發生事件數。