1、epolllinux
1.epoll只有epoll_create,epoll_ctl,epoll_wait 3個系統調用編程
(1)int epoll_create(int size); 數組
建立一個epoll的句柄。自從linux2.6.8以後,size參數是被忽略的。須要注意的是,當建立好epoll句柄後,它就是會佔用一個fd值,在linux下若是查看/proc/進程id/fd/,是可以看到這個fd的,因此在使用完epoll後,必須調用close()關閉,不然可能致使fd被耗盡。 瀏覽器
(2)int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);socket
epoll的事件註冊函數,它不一樣於select()是在監聽事件時告訴內核要監聽什麼類型的事件,而是在這裏先註冊要監聽的事件類型。ide
a.第一個參數是epoll_create()的返回值。 函數
b.第二個參數表示動做,用三個宏來表示: 測試
EPOLL_CTL_ADD:註冊新的fd到epfd中;spa
EPOLL_CTL_MOD:修改已經註冊的fd的監聽事;3d
EPOLL_CTL_DEL:從epfd中刪除一個fd;
c.第三個參數是須要監聽的fd。
d.第四個參數是告訴內核須要監聽什麼事,struct epoll_event結構以下:
(3)int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
收集在epoll監控的事件中已經發送的事件。參數events是分配好的epoll_event結構體數組,epoll將會把發生的事件賦值到events數組中(events不能夠是空指針,內核只負責把數據復 制到這個events數組中,不會去幫助咱們在用戶態中分配內存)。maxevents告以內核這個 events有多大,這個 maxevents的值不能大於建立epoll_create()時的size,參數timeout是超時 時間(毫秒,0會當即返回,-1將不肯定,也有說法說是永久阻塞)。若是函數調用成功,返回對應I/O上已準備好的文件描述符數目,如返回0表示已超時。
2.Epoll的2種工做方式-水平觸發(LT)和邊緣觸發(ET)
LT(level triggered)是epoll缺省的工做方式,而且同時支持block和no-block socket.在這種作法中,內核告訴你一個文件描述符是否就緒了,而後你能夠對這個就緒的fd進行IO操做。若是你不做任何操做,內核仍是會繼續通知你的,因此,這種模式編程出錯誤可能性要小一點。傳統的select/poll都是這種模型的表明.
ET (edge-triggered)是高速工做方式,只支持no-block socket,它效率要比LT更高。ET與LT的區別在於,當一個新的事件到來時,ET模式下固然能夠從epoll_wait調用中獲取到這個事件,但是若是此次沒有把這個事件對應的套接字緩衝區處理完,在這個套接字中沒有新的事件 再次到來時,在ET模式下是沒法再次從epoll_wait調用中獲取這個事件的。而LT模式正好相反,只要一個事件對應的套接字緩衝區還有數據,就總能從epoll_wait中獲取這個事件。所以,LT模式下開發基於epoll的應用要簡單些,不太容易出錯。而在ET模式下事件發生時,若是沒有完全地將緩衝區數據處理完,則會致使緩衝區中的用戶請求得不到響應。
2、代碼實現
3、結果顯示
1.通訊結果
2.用瀏覽器測試簡單http消息回顯。