epoll模型總結2010-10-17 19:20:21| 分類: 網路程式設計 | 標籤:學習 |字型大小大中小 訂閱 .
在linux網路程式設計中,很長時間都是在使用select模型做事件觸發,現在linux在核心中加了一種新的機制,即epoll模型。相比與select,epoll最大的好處在於不會隨著fd的增加而線性的降低效率。而select在核心中的實現方式為輪詢集合中的每乙個fd。fd越多消耗的時間自然越大。並且核心中select允許的最大fd數為1024,修改必須重新編譯核心,自然比較麻煩。
一.epoll常用的函式
1.int epoll_create(int size);
建立乙個epoll控制代碼,size用來告訴核心監聽的最大數目,不同與select的第乙個引數(最大fd+1),需要注意的是在退出的時候,必須呼叫close關閉控制代碼,否則可能導致fd耗盡。
2.int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event);
epoll事件註冊函式,它不同於select是在監聽時告訴核心要監聽什麼型別的事件,而是在這裡先註冊要監聽的事件型別。
第乙個引數是呼叫epoll_create建立的epoll控制代碼。
第二個引數是操作型別。
epoll_ctl_add:新增新的事件到epfd。
epoll_ctl_mod:修改epfd中的事件。
epoll_ctl_del:刪除epfd中的事件。
第三個引數是要監聽的fd。
第四個引數告訴核心要監聽什麼事件。struct event結構如下:
struct epoll_eventelse if(0 == buflen)
if (buflen == sizeof(buf))//資料可能還沒讀完
else
}還有,假設傳送流量大於接收流量,由於採用的是非阻塞的模式,send()雖然返回,但資料並未被接收端成功接收。這樣不斷的讀與發,到快取區滿了會產生eagain錯誤,同時不理會這次請求傳送的資料。所以需要socket_send()函式專門處理這種情況,盡量等到資料傳送完畢後返回,返回-1表示錯誤。在socket_send內部,當傳送快取區已滿(send 返回-1,errno為eagain)時,等待一段時間後重新傳送。
ssize_t socket_send(int sockfd,const char* buffer,int buflen)
if (errno == eagain)//快取區已滿,等待後再發
return -1;
}if ((size_t)tmp == total)
return buflen;
total -= tmp;
p += tmp;
}return tmp;
}
epoll觸發事件的分析
我們知道,可以將套接字放入到epoll中監聽,當套接字上有事件發生時,epoll就會通知我們。epoll機制可以監聽套接字上的以下6種事件 那麼,什麼情況下會在套接字上觸發以上6種事件呢?當我們監聽套接字上的epollin epollrdhup事件時,總結如下 綜上,可能出現的事件組合為 1.epo...
Linux事件觸發 epoll相關函式
在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為在核心中的select實現中,它是採用輪詢來處理的,輪詢的fd數目越多,自然...
EventLog元件讀寫事件日誌
使用.net中的eventlog控制項使您可以訪問或自定義windows 事件日誌,事件日誌記錄關於重要的軟體或硬體事件的資訊。通過 eventlog,可以讀取現有日誌,向日誌中寫入項,建立或刪除事件源,刪除日誌,以及響應日誌項。也可在建立事件源時建立新日誌。例項化乙個windows 事件日誌例項 ...