發表文章

目前顯示的是 八月, 2012的文章

epoll - I/O event notification facility

最近要寫一支 Network Service Daemon 的程式,本來想用 select 來寫,後來印象中有看過其他的解決方案,所以就稍微查了一下,於是就發現了今天的主角 ~ epoll。epoll 是一套在 Linux 2.6上推出的 I/O Event 機制(其實是2.5.44,但因為我只看穩定版的關係,所以直接寫2.6)。

select 或是 poll 機制比起來,epoll 最大的優點是它只會對Active的FD進行操作。什麼叫作只會對 Active 的 FD 進行操作?回想一下在寫 select 的程式時,總是會寫一個迴圈去掃描所有 FDSET 裏面的成員,去找到到底是哪一個 FD 有事件發生,而在epoll 裏面就不會這樣,它只會回傳有在運作的FD_SUBSET,實作的方式以後再研究吧,不過聽說是根據 FD 的 callback 函式有沒有被呼叫進行判別。其他的優點像是避開了select 的 FD_SETSIZE 限制之類的就不提了,因為感覺上這個參數是可以被改大的。

epoll 的函式只有三個:

intepoll_create ( int size );
intepoll_ctl ( int epfd, int op, int fd, struct epoll_event *event );
intepoll_wait ( int epfd, struct epoll_event *events, int maxevents, int timeout );

看名字並不難理解,所以就不加說明了,有問題就看下面的範例吧。下面是一支使用 epoll 的 TCP Echo Server 程式。Client 端就不附上了,反正改改也就是了。 #include <stdio.h>// for printf() and fprintf() #include <sys/socket.h>// for socket(), bind(), and connect() #include <arpa/inet.h>// for sockaddr_in and inet_ntoa() #include <stdlib.h>// for atoi() and exit() #include <string.h>//…