epoll鏄璺鐢↖O(I/O Multiplexing)涓殑涓縐嶆柟寮?浣嗘槸浠呯敤浜巐inux2.6浠ヤ笂鍐呮牳,鍦ㄥ紑濮嬭璁鴻繖涓棶棰樹箣鍓?鍏堟潵瑙i噴涓涓嬩負浠涔堥渶瑕佸璺鐢↖O.
浠ヤ竴涓敓媧諱腑鐨勪緥瀛愭潵瑙i噴.
鍋囪浣犲湪澶у涓涔?瑕佺瓑寰呬竴涓湅鍙嬫潵璁?鑰岃繖涓湅鍙嬪彧鐭ラ亾浣犲湪A鍙鋒ゼ,浣嗘槸涓嶇煡閬撲綘鍏蜂綋浣忓湪鍝噷,浜庢槸浣犱滑綰﹀ソ浜嗗湪A鍙鋒ゼ闂ㄥ彛瑙侀潰.
濡傛灉浣犱嬌鐢ㄧ殑闃誨IO妯″瀷鏉ュ鐞嗚繖涓棶棰?閭d箞浣犲氨鍙兘涓鐩村畧鍊欏湪A鍙鋒ゼ闂ㄥ彛絳夊緟鏈嬪弸鐨勫埌鏉?鍦ㄨ繖孌墊椂闂撮噷浣犱笉鑳藉仛鍒殑浜嬫儏,涓嶉毦鐭ラ亾,榪欑鏂瑰紡鐨勬晥鐜囨槸浣庝笅鐨?
鐜板湪鏃朵唬鍙樺寲浜?寮濮嬩嬌鐢ㄥ璺鐢↖O妯″瀷鏉ュ鐞嗚繖涓棶棰?浣犲憡璇変綘鐨勬湅鍙嬫潵浜咥鍙鋒ゼ鎵炬ゼ綆″ぇ濡?璁╁ス鍛婅瘔浣犺鎬庝箞璧?榪欓噷鐨勬ゼ綆″ぇ濡堟壆婕旂殑灝辨槸澶氳礬澶嶇敤IO鐨勮鑹?
榪涗竴姝ヨВ閲妔elect鍜宔poll妯″瀷鐨勫樊寮?
select鐗堝ぇ濡堝仛鐨勬槸濡備笅鐨勪簨鎯?姣斿鍚屽鐢茬殑鏈嬪弸鏉ヤ簡,select鐗堝ぇ濡堟瘮杈冪,濂瑰甫鐫鏈嬪弸鎸ㄤ釜鎴塊棿榪涜鏌ヨ璋佹槸鍚屽鐢?浣犵瓑鐨勬湅鍙嬫潵浜?浜庢槸鍦ㄥ疄闄呯殑浠g爜涓?select鐗堝ぇ濡堝仛鐨勬槸浠ヤ笅鐨勪簨鎯?
int n = select(&readset,NULL,NULL,100);
for (int i = 0; n > 0; ++i)
{
if (FD_ISSET(fdarray[i], &readset))
{
do_something(fdarray[i]);
--n;
}
}
epoll鐗堝ぇ濡堝氨姣旇緝鍏堣繘浜?濂硅涓嬩簡鍚屽鐢茬殑淇℃伅,姣斿璇翠粬鐨勬埧闂村彿,閭d箞絳夊悓瀛︾敳鐨勬湅鍙嬪埌鏉ユ椂,鍙渶瑕佸憡璇夎鏈嬪弸鍚屽鐢插湪鍝釜鎴塊棿鍗沖彲,涓嶇敤鑷繁浜茶嚜甯︾潃浜烘弧澶фゼ鐨勬壘浜轟簡.浜庢槸epoll鐗堝ぇ濡堝仛鐨勪簨鎯呭彲浠ョ敤濡備笅鐨勪唬鐮佽〃紺?
n=epoll_wait(epfd,events,20,500);
for(i=0;i<n;++i)
{
do_something(events[n]);
}
鍦╡poll涓?鍏抽敭鐨勬暟鎹粨鏋別poll_event瀹氫箟濡備笅:
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
鍙互鐪嬪埌,epoll_data鏄竴涓猽nion緇撴瀯浣?瀹冨氨鏄痚poll鐗堝ぇ濡堢敤浜庝繚瀛樺悓瀛︿俊鎭殑緇撴瀯浣?瀹冨彲浠ヤ繚瀛樺緢澶氱被鍨嬬殑淇℃伅:fd,鎸囬拡,絳夌瓑.鏈変簡榪欎釜緇撴瀯浣?epoll澶у鍙互涓嶇敤鍚圭伆涔嬪姏灝卞彲浠ュ畾浣嶅埌鍚屽鐢?
鍒皬鐪嬩簡榪欎簺鏁堢巼鐨勬彁楂?鍦ㄤ竴涓ぇ瑙勬ā騫跺彂鐨勬湇鍔″櫒涓?杞IO鏄渶鑰楁椂闂寸殑鎿嶄綔涔嬩竴.鍐嶅洖鍒伴偅涓緥瀛愪腑,濡傛灉姣忓埌鏉ヤ竴涓湅鍙嬫ゼ綆″ぇ濡堥兘瑕佸叏妤肩殑鏌ヨ鍚屽,閭d箞澶勭悊鐨勬晥鐜囧繀鐒跺氨浣庝笅浜?榪囦笉涔呮ゼ搴曞氨鏈変笉灝戠殑浜轟簡.
瀵規瘮鏈鏃╃粰鍑虹殑闃誨IO鐨勫鐞嗘ā鍨? 鍙互鐪嬪埌閲囩敤浜嗗璺鐢↖O涔嬪悗, 紼嬪簭鍙互鑷敱鐨勮繘琛岃嚜宸遍櫎浜咺O鎿嶄綔涔嬪鐨勫伐浣? 鍙湁鍒癐O鐘舵佸彂鐢熷彉鍖栫殑鏃跺欑敱澶氳礬澶嶇敤IO榪涜閫氱煡, 鐒跺悗鍐嶉噰鍙栫浉搴旂殑鎿嶄綔, 鑰屼笉鐢ㄤ竴鐩撮樆濉炵瓑寰匢O鐘舵佸彂鐢熷彉鍖栦簡.
浠庝笂闈㈢殑鍒嗘瀽涔熷彲浠ョ湅鍑?epoll姣攕elect鐨勬彁楂樺疄闄呬笂鏄竴涓敤絀洪棿鎹㈡椂闂存濇兂鐨勫叿浣撳簲鐢?/span>