select 和 epoll的程式設計實現區別 2

2021-07-09 15:22:01 字數 1754 閱讀 1523

原文:

網上已有很多關於這兩個函式的效率問題的文章,在這裡不再累述。

本文主要對兩個函式的程式設計細節問題,進行分析。

epoll使用et模式。select使用非阻塞模式

共用**

1。設定控制代碼為非阻塞方式

[cpp]view plain

copy

intsetnonblocking(

intsockfd)     

2。建立監聽控制代碼並開啟監聽

[cpp]view plain

copy

intcreate_listen_fd(

void

)    

測試場景

1。客戶端傳送資料後等待,伺服器端不對到達資料進行讀取。

目的:測試如果有事件到達,但處理結束後管道內仍然有資料存留,各種i/o復用模式是否仍對此事件作出相應。

結果:1)epoll在資料到達後被喚醒,處理完業務流程後(不對socket管道內資料進行讀取),又被阻塞到epoll_wait上。

[cpp]view plain

copy

intmain(

intargc, 

char

** argv)  

if(setnonblocking(listenfd) == -1)  

//建立乙個epoll的控制代碼,size用來告訴核心這個監聽的數目一共有多大。

epfd = epoll_create(256);  

//設定與要處理的事件相關的檔案描述符

ev.data.fd = listenfd;  

//設定要處理的事件型別,當描述符可讀時出發,出發方式為et模式

ev.events = epollin | epollet;  

//註冊epoll事件

epoll_ctl(epfd, epoll_ctl_add, listenfd, &ev);  

for(;;)  

else

if(events[i].events & epollin)  

}  else

if(rn == 0)  

printf("read buf %s/n"

, buf);  

}  }  

}  }  

return

0;  

}    

2)select在資料到達後被喚醒,處理完業務流程後(不對socket管道內資料進行讀取),select會再次被喚醒。

[cpp]view plain

copy

intmain(

intargc, 

char

** argv)  

if((listenfd = create_listen_fd()) == -1)  

setnonblocking(listenfd);  

fd_zero(&rset);  

fd_set(listenfd, &rset);  

fd_zero(&allset);  

allset = rset;  

imax = listenfd;  

for(;;)  

if(--nfds == 0)  

continue

;  }  

else

}  }  }  

return

0;     

}   0

給主人留下些什麼吧!~~

Select和epoll的區別

當乙個節點和多個節點建立連線時,如何高效的處理多個連線的資料,下面具體分析兩者的區別。1.select函式 函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout ...

epoll和select的分析

昨天關於epoll和select的問題被阿里的面試官狂虐,今天好好準備下吧。兩個函式都是i o多路復用 select 函式 int select int maxfd,fd set read,fd set write,fd set exception,struct timeval timeout 第乙...

Select和epoll的區別

當乙個節點和多個節點建立連線時,如何高效的處理多個連線的資料,下面具體分析兩者的區別。1.select函式 函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout ...