昨天關於epoll和select的問題被阿里的面試官狂虐,今天好好準備下吧。。。兩個函式都是i/o多路復用
select 函式
int select(int maxfd,fd_set* read,fd_set* write,fd_set* exception,struct timeval* timeout);
第乙個引數是傳遞給核心的最大的描述符+1,
引數read,write,exception,是觀察這些描述符上是否有讀、寫、異常等,
timeout有三種方式 1)timeout == null時,永遠等待下去,直到有乙個描述符準備好 2)timeout->sec != 0 || timeout->usec != 0 有乙個描述符準備好就返回,但不超過給定
的時間3)timeout->sec == 0 || timeout->usec == 0,根本不等待,立即返回.
函式返回準備好的描述符的個數
epoll 函式
int epoll_create(int size) 返回乙個要控制代碼,size是告訴核心大致要處理的事件的數目
int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event) epfd是epoll_create返回的控制代碼,op是操作(三種,新增事件,修改事件,刪除事件),fd是監聽的連線套接字,event
是在告訴epoll對什麼樣的事件感興趣
int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout)
收集在epoll監控的事件中發生的事件,epoll會把發生的事件複製到events陣列中,maxevents是events陣列的大小,timeout表示沒有檢測到時事件發生時最多等待的時間,如果是0的話,會立即返回
兩種觸發方式:水平觸發和垂直觸發,當乙個事件發生時,通過epoll_wait可以獲取到該事件,但是當該事件對應的套接字緩衝區未處理完時,設定為邊緣觸發時,通過epoll_wait 不能獲取到該事件,通過水平觸發的方式可以.
三點不同:
1)select對檔案描述符的個數有限制,epoll對事件發生的個數沒有限制
2)select採用輪詢的方式檢查每個描述符是否是活躍的,epoll_wait獲得的事件都是活躍的
3)epoll採用的是記憶體對映的技術,加速了核心態和使用者態之間的訊息傳遞
參考:
Select和epoll的區別
當乙個節點和多個節點建立連線時,如何高效的處理多個連線的資料,下面具體分析兩者的區別。1.select函式 函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout ...
Select和epoll的區別
當乙個節點和多個節點建立連線時,如何高效的處理多個連線的資料,下面具體分析兩者的區別。1.select函式 函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout ...
epoll和select的區別
做以簡單區分為面試作答提供一些幫助 select 和 epoll都為一種網路i o模型,都是採用了檢測了控制代碼集合中的資料,來實現多路復用。select檔案控制代碼檢測數有限,核心中 fd setsize定義為2048超出範圍將無法檢測,在掃瞄上select 採用的是輪詢的方式當檢測的量太大時會造...