锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产精品免费一区,欧美激情视频一区二区三区不卡,亚洲国产小视频http://www.shnenglu.com/Bugs/MMORPG game develop.zh-cnMon, 29 Sep 2025 22:38:46 GMTMon, 29 Sep 2025 22:38:46 GMT60鎴戣嚜宸辯殑blog錛?/title><link>http://www.shnenglu.com/Bugs/archive/2008/11/11/66614.html</link><dc:creator>Bugs</dc:creator><author>Bugs</author><pubDate>Tue, 11 Nov 2008 08:15:00 GMT</pubDate><guid>http://www.shnenglu.com/Bugs/archive/2008/11/11/66614.html</guid><wfw:comment>http://www.shnenglu.com/Bugs/comments/66614.html</wfw:comment><comments>http://www.shnenglu.com/Bugs/archive/2008/11/11/66614.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/Bugs/comments/commentRss/66614.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Bugs/services/trackbacks/66614.html</trackback:ping><description><![CDATA[嬈㈣繋澶у鍏変復鎴戣嚜宸辯殑Blog錛歨ttp://iBugs.net <img src ="http://www.shnenglu.com/Bugs/aggbug/66614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Bugs/" target="_blank">Bugs</a> 2008-11-11 16:15 <a href="http://www.shnenglu.com/Bugs/archive/2008/11/11/66614.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>SCTP vs. TCPhttp://www.shnenglu.com/Bugs/archive/2008/06/26/54651.htmlBugsBugsThu, 26 Jun 2008 03:28:00 GMThttp://www.shnenglu.com/Bugs/archive/2008/06/26/54651.htmlhttp://www.shnenglu.com/Bugs/comments/54651.htmlhttp://www.shnenglu.com/Bugs/archive/2008/06/26/54651.html#Feedback0http://www.shnenglu.com/Bugs/comments/commentRss/54651.htmlhttp://www.shnenglu.com/Bugs/services/trackbacks/54651.html 

1 嫻佹帶鍒朵紶杈撳崗璁紙SCTP錛夊彂灞曠畝浠?/p>


銆銆闅忕潃IP緗戝悜澶氫笟鍔$綉鍙戝睍錛屽挨鍏舵槸鐩墠IP鐢佃瘽銆両P瑙嗛浼氳絳変笟鍔$殑鍙戝睍錛屽湪IP緗戜腑浼犻佷俊浠や俊鎭垚涓哄繀鐒躲傜洰鍓岻P緗戜腑淇′護娑堟伅鐨勪氦鎹㈤氬父鏄嬌鐢═CP鎴朥DP瀹屾垚錛屼絾鏄繖涓や釜鍗忚閮戒笉鑳芥弧瓚崇數淇¤繍钀ョ綉涓俊浠ゆ壙杞界殑瑕佹眰銆?/p>


銆銆涓洪傚簲IP緗戞垚涓虹數淇¤繍钀ユ牳蹇冪綉鐨勫彂灞曡秼鍔匡紝IETF 鐨勪俊浠や紶杈撳伐浣滅粍錛圫IGTRAN錛変竴鐩村湪鐮旂┒鍜屽埗瀹欼P緗戞柊涓浠g殑浼犺緭鍗忚錛屽茍鍦↖ETF RFC 2960涓畾涔変簡嫻佹帶鍒朵紶杈撳崗璁紙SCTP錛孲tream Control Transmission Protocol錛夈係CTP鏄潰鍚戣繛鎺ョ殑鍙潬浼犻佸崗璁紝瀹冨悜涓婂眰搴旂敤鎻愪緵浜嗕笅鍒楁湇鍔★細


銆銆· 搴旂敤鏁版嵁鐨勬棤閿欒鏃犻噸澶嶇殑鍙潬浼犺緭錛?/p>


銆銆· 鏍規嵁媯嫻嬪埌鐨凪TU闀垮害榪涜鏁版嵁鍖呭垎孌靛鐞嗭紝閬垮厤IP灞傜殑鍒嗘錛?/p>


銆銆· 鍦ㄥ涓祦闂寸殑鐢ㄦ埛娑堟伅鏈夊簭閫掍氦錛屽強鍗曠敤鎴鋒秷鎭寜鍒拌揪欏哄簭閫掍氦鐨勯夐」錛?/p>


銆銆· 閫氳繃鏀寔鍏寵仈鐨勫瀹夸富鏈虹壒鎬э紝瀹炵幇緗戠粶綰у閿欍?/p>


銆銆SCTP鏄負浼犺緭淇′護涓氬姟嫻佽屽埗瀹氱殑錛屽畠鏈韓鎵鍏鋒湁鐨勩佷紭浜嶵CP鐨勪竴浜涘厛榪涘崗璁満鍒訛紝濡傞夋嫨鎬ч噸浼犮佹棤搴忛掍氦鍜屾敮鎸佸縐嶇綉緇滅壒鎬х瓑錛屼嬌寰桽CTP鑳藉鍦ㄤ竴瀹氱▼搴︿笂婊¤凍楂樻ц兘浼犺緭鐨勯渶姹傘傝屼笖錛孲CTP閲囩敤浜嗙被鍚孴CP鐨勬祦閲忔帶鍒舵満鍒訛紝涓嶅瓨鍦ㄧ被浼煎熀浜嶶DP鐨勫疄鏃跺獟浣撴祦瀵筎CP鎬ц兘閫犳垚鐨勫姡鍖栧共鎵伴棶棰樺拰鍏鉤鎬ч棶棰樸傚洜姝わ紝SCTP灝嗘湁鍙兘鍙栦唬TCP錛屾垚涓轟笅涓浠P緗戜笂闈㈠悜榪炴帴鐨勫彲闈犱紶閫佸眰鍗忚銆?/p>


2 TCP鐨勪笉瓚?/p>


銆銆TCP鏄洰鍓岻nternet涓婂簲鐢ㄦ渶騫挎硾鐨勯潰鍚戣繛鎺ョ殑浼犻佸眰鍗忚錛屽畠涓洪氫俊鐨勪袱绔彁渚涗簡鍙潬鐨勬暟鎹紶杈擄紝鑰屼笖鎻愪緵浜嗘祦閲忔帶鍒跺拰鎷ュ鎺у埗鍔熻兘銆傜敱浜庡師鏉P緗戞彁渚涚殑鏄?#8220;灝藉姏鑰屼負錛坆est-effort錛?#8221;鐨勬湇鍔★紝鍥犳TCP瀛樺湪璁稿涓嶈凍涔嬪錛?/p>


銆銆· TCP鏄潰鍚戝瓧鑺傛祦鐨勩傝繖鎰忓懗鐫娑堟伅鐨勬弿榪板繀欏葷敱搴旂敤鏉ュ畬鎴愶紝鑰屼笖瑕佸湪娑堟伅緇撴潫鏃舵樉紺洪氱煡TCP浠ヨ揩浣垮叾绔嬪嵆鍙戦佺浉搴旂殑鏁版嵁銆?/p>


銆銆· 璁稿搴旂敤鍙渶瑕佷俊浠や俊鎭殑閮ㄥ垎鏈夊簭錛屼緥濡傚睘浜庡悓涓鍛煎彨鎴栧悓涓浼氳瘽鐨勬秷鎭氨鏄繖鏍楓傝孴CP鍙彁渚涗弗鏍肩殑鏁版嵁鎸夊簭浼犺緭錛岃繖浼氬鑷翠笉蹇呰鐨勯槦澶存嫢濉炲茍浣挎秷鎭殑浼犺緭鏃跺歡澧炲ぇ銆?/p>


銆銆· TCP榪炴帴鐩存帴鐢變竴瀵逛紶閫佸眰鍦板潃錛圛P鍦板潃鍜岀鍙e彿錛夎瘑鍒紝鏃犳硶鎻愪緵瀵瑰瀹夸富鏈虹殑閫忔槑鏀寔銆?/p>


銆銆· 鍏稿瀷鐨凾CP瀹炵幇涓嶅厑璁擱珮灞傚簲鐢ㄨ瀹氬崗璁帶鍒跺弬鏁般備絾鏄竴浜涘簲鐢ㄥ彲鑳戒細闇瑕佽皟鑺備紶閫佸眰鍗忚鐨勫睘鎬т互婊¤凍鍏惰姹傦紝渚嬪鏌愪簺搴旂敤鏈夎緝楂樼殑鏃跺歡瑕佹眰錛岃屽彟涓浜涘垯鍙姹傝緝楂樼殑鍙潬鎬с?/p>


3 榪炴帴涓庡叧鑱?/p>


銆銆TCP涓殑榪炴帴鏄寚涓や釜TCP绔偣閫氳繃“涓夋鎻℃墜”榪囩▼寤虹珛鐨勭敱涓瀵逛紶閫佸眰鍦板潃錛圛P鍦板潃鍜岀鍙e彿錛夎瘑鍒殑浼犻侀氶亾銆?/p>


銆銆鍦⊿CTP涓? TCP涓殑榪炴帴琚紩鐢充負鍏寵仈(associ-
ation錛夈備竴涓叧鑱旂殑涓や釜SCTP绔偣閮藉悜瀵規柟鎻愪緵涓涓猄CTP绔彛鍙峰拰涓涓狪P鍦板潃鍒楄〃錛岃繖鏍鋒瘡涓叧鑱旈兘鐢變袱涓猄CTP绔彛鍙峰拰涓や釜IP鍦板潃鍒楄〃鏉ヨ瘑鍒傚湪涓涓叧鑱斿唴鐨勬嫢濉炴帶鍒舵満鍒朵笌TCP榪炴帴鐨勬嫢濉炴帶鍒舵満鍒剁被浼箋?/p>


銆銆涓涓叧鑱旀槸鐢卞涓崟鍚戠殑嫻佺粍鎴愮殑銆傚悇涓祦涔嬮棿鐩稿鐙珛錛屽彲浠ュ崟鐙彂閫佹暟鎹屼笉鍙楀叾浠栨祦鐨勫獎鍝嶏紝涔熷彲浠ュ叡鍚屽疄鐜扮敤鎴鋒暟鎹殑鏈夊簭閫掍氦銆傛祦鐨勫緩绔嬪拰鎷嗛櫎榪囩▼鐩稿鐙珛銆佺畝鍗曘傝屽叧鑱旂殑寤虹珛榪囩▼鐩稿鑰岃█灝辨瘮杈冨鏉傦紝鏄釜“鍥涙鎻℃墜”榪囩▼錛岃屼笖鍏朵腑瑕佺敤鍒?#8220;cookie”鐨勬蹇點傛墍璋?#8220;cookie”瀹為檯灝辨槸涓涓惈鏈夌鐐瑰垵濮嬩俊鎭拰鍔犲瘑淇℃伅鐨勬暟鎹潡錛屽畠鍦ㄥ叧鑱斿緩绔嬫椂琚氫俊鐨勪袱绔鐞嗗茍浜ゆ崲銆?/p>


4 SCTP鐨勫瀹夸富鏈虹壒鎬у強搴旂敤


銆銆SCTP鏀寔浼犻佸眰鐨勫瀹夸富鏈烘湇鍔°傚綋緗戠粶鍙戠敓鏁呴殰鏃訛紝澶氬涓繪満鏈嶅姟鍙互澧炲己緗戠粶鐨勫仴澹э紙robustness錛夈傚湪鏌愪簺搴旂敤鍦哄悎錛岃繖涓壒鎬ч潪甯擱噸瑕併係CTP瀵瑰瀹夸富鏈烘湇鍔$殑鏀寔瑕佹眰鍏寵仈鐨勪竴绔垨涓ょ鍦ㄤ笉鍚岀殑緗戠粶鎺ュ彛涓婂垎閰嶆湁澶氫釜IP鍦板潃銆?/p>


銆銆涓鑸潵璇達紝瑕佸湪閫氫俊鐨勪袱绔疄鐜扮湡姝g殑鏁呴殰寮規ф仮澶嶏紝姣忎釜绔偣閮介渶瑕佹湁涓涓互涓婄殑IP緗戠粶鎺ュ彛錛屼互鏀寔澶氬涓繪満鏈嶅姟銆傚湪榪欑鎯呭喌涓嬶紝璺緞浣跨敤鐨勬暟閲忓氨鏄墍鏈夌鐐圭殑緗戠粶鎺ュ彛鐨勬渶灝忔暟錛屾鏃剁鐐硅姝g‘閫夋嫨鑷繁鐨勬簮鍦板潃鎵嶈兘鑾峰緱鏈浣寵礬寰勩備絾鏄紝濡傛灉绔偣鎬繪槸浣跨敤鍚屼竴涓簮鍦板潃錛岄偅涔堢鐐瑰氨鍚屾牱浼氬嚭鐜板崟鐐規晠闅溿傚洜涓哄綋绔偣閫夋嫨涓涓簮鍦板潃鏃訛紝瀹冩繪槸閫夋嫨鏁版嵁鍖呯殑婧愬湴鍧鏉ュ搴旂綉緇滄帴鍙g殑IP鍦板潃錛岃屽湪緗戠粶鎺ュ彛涓婃暟鎹寘灝嗗彈鍒扮粦瀹氬湴鍧鐨勯檺鍒躲傛崲鍙ヨ瘽璇達紝鐢變簬緇戝畾鍦板潃鐨勯檺鍒訛紝绔偣姘歌繙閮戒笉鑳介夋嫨涓嶅睘浜庤SCTP鍏寵仈鐨勬簮鍦板潃錛屽悓鏃跺绔鐐逛篃蹇呴』璁ゅ彲璇CTP鍏寵仈浣跨敤鐨勪換浣曚竴涓簮鍦板潃銆?/p>


銆銆褰撶鐐瑰湪涓涓瀹夸富鏈轟笂鏃訛紝濡傛灉鍏寵仈鐨勪袱绔粦瀹氭湁澶氫釜鍦板潃錛孲CTP鍏寵仈鐨勫彲鐢ㄦу皢澶уぇ澧炲己銆傚埄鐢ㄥ瀹夸富鏈鴻繖涓壒鎬у彲浠ュ湪涓や釜SCTP绔偣闂村緩绔嬪啑浣欑殑璺緞錛岃繖瀵歸偅浜涗竴鐩村姹傚湪緗戠粶鐨勪紶閫佸眰嬈″氨鑳芥彁渚涘閿欐満鍒剁殑搴旂敤鐗瑰埆鏈夌敤銆傝鍦⊿CTP鐨勪袱涓鐐歸棿寤虹珛鍐椾綑璺緞錛岃姹備袱涓鐐圭殑璁懼閮藉繀欏繪湁澶氫釜鎺ュ彛錛屽茍鍒嗛厤澶氫釜鍦板潃錛岃屼笖蹇呴』閰嶇疆濂借礬鐢便?/p>


銆銆鍥犳錛岄氳繃“澶氬涓繪満”鐗規э紝SCTP鎻愪緵浜嗚緝TCP寮哄ぇ寰楀鐨勮礬寰勭姸鎬佺洃鎺у姛鑳姐係CTP鍙互鐩戞祴榪滅鍦板潃鐨勫彲杈炬э紝褰撹繙绔湴鍧涓嶅彲杈炬椂錛屽畠鑳介氳繃浣跨敤澶囩敤鍦板潃鏇挎崲涓葷敤鍦板潃瀹炵幇鏁呴殰鐨勮嚜鍔ㄦ仮澶嶏紝鑰屼笖榪欎竴榪囩▼涓嶉渶瑕佷笂灞傚崗璁殑騫查銆備篃灝辨槸璇達紝“澶氬涓繪満”鐗規у彲浠ヤ嬌涓涓叧鑱斿彲浠ュ湪澶氫釜浼犺緭璺緞闂撮夋嫨鍜屽垏鎹紝浠庤屾彁楂樹簡緗戠粶綰у閿欑殑鑳藉姏銆?/p>


5 TCP涓嶴CTP鐨勫畨鍏ㄦ瘮杈?/p>


銆銆1. TCP鐨勫畨鍏ㄩ棶棰?/p>


銆銆涓浜汿CP搴旂敤琚叕璁や細鍙楀埌DoS鏀誨嚮銆備緥濡傦紝鏀誨嚮鑰呭彲浠ラ氳繃鍙戦佸ぇ閲忕殑榪炴帴寤虹珛璇鋒眰錛圱CP-SYN鏁版嵁鍖咃級鏉ユ敾鍑葷洰鐨勫湴錛屾湁鍙兘鏉ヨ嚜浼鐨処P鍦板潃銆傝鏀誨嚮涓繪満灝嗕笉鍋滃湴鍙戦丼YN-ACK鏁版嵁鍖呮潵鍥炲錛屽茍榪涘叆SYN-received鐘舵侊紝鐢氳嚦SYN闃熷垪灝嗚鎸ゆ弧錛堜緥濡傦紝絳夊緟寤虹珛鐨勮繛鎺ユ暟浼氳揪鍒頒竴涓瀬闄愶級錛岃屼笖瀹冨皢鎷掔粷鏂扮殑榪炴帴寤虹珛璇鋒眰銆?/p>


銆銆鍙﹀錛屼吉瑁呰繛鎺ユ槸瀵筎CP鐨勫彟涓涓綔鍦ㄥ▉鑳併傞氳繃鐚滄祴鏈夋晥鐨勫簭鍒楀彿錛屾敾鍑昏呭皢鍙兘浼鎴愪竴涓悎娉曡繛鎺ャ備絾鏄紝閫氳繃浣跨敤涓涓畨鍏ㄧ殑Hashsum綆楁硶錛屽鐩墠SYN-cookie榪涜浼鐨勬敾鍑葷殑鍙兘鎬у彧鏈?/224銆備緥濡傚綋浣跨敤SYS-cookie鏃訛紝瑕佹垚鍔熶綔涓轟竴涓吉瑁呯殑榪炴帴鏃訛紝鏀誨嚮鑰呭皢涓嶅緱涓嶅彂閫?24涓暟鎹寘銆?/p>


銆銆2. SCTP鐨勫畨鍏ㄦ満鍒?/p>


銆銆SCTP鍦ㄨ璁℃椂灝卞厖鍒嗚冭檻浜員CP鐨勪笉瓚熾備負闃叉鏀誨嚮鑰呭彂閫佷吉瑁呯殑SCTP鏁版嵁鍖呭埌鐜版湁鐨勮繛鎺ヤ腑錛孲CTP鐨勪袱绔兘浣跨敤涓涓О涓?#8220;璁よ瘉鏍囪”鐨?2bit鏁版嵁鏉ョ‘淇濇暟鎹寘鐪熸灞炰簬鐜版湁鐨勮繛鎺ャ傚洜姝わ紝闄や簡鍚堝茍灞炰簬涓涓繛鎺ョ殑婧愮鍙e拰鐩殑绔彛鐨勫湴鍧澶栵紝涓涓湁鏁堢殑SCTP鏁版嵁鍖呰繕蹇呴』鏈変竴涓紜殑鏍囪銆?/p>


銆銆璺烼CP涓嶅悓鐨勬槸錛孲CTP瑕佹眰鍦ㄨ繛鎺ュ緩绔嬫椂蹇呴』浣跨敤“cookie”銆傚鏈嶅姟鍣ㄦ潵璇達紝蹇呴』浜ゆ崲3涓俊鎭寘錛圛NIT銆両NIT-ACK銆丆OOKIE-ECHO錛夛紝鎵嶈兘寤虹珛涓涓畬鏁寸殑鏂拌繛鎺ャ?#8220;cookie”鏄釜闀垮害鍙彉鐨勶紝鍖呭惈鎵鏈夊拰鍦ㄦ湇鍔″櫒绔垵濮嬪寲TCB鐨勭浉鍏蟲暟鎹紝鍔犱笂浣跨敤HMAC鏉ョ‘淇濆畠鐨勫畨鍏ㄣ侶MAC鏄湪cookie涓敤鏉ヨ綆楃殑錛屾槸涓涓繚瀵嗐佹湇鍔″櫒鎵鎷ユ湁鐨刱ey銆傚紩鍏ヨ繖縐嶆満鍒剁殑鐩殑鍦ㄤ簬澧炲己鍗忚鐨勫畨鍏ㄦэ紝闃叉DoS鏀誨嚮鍜屼吉瑁呯瓑娼滃湪鐨勬敾鍑匯?/p>


銆銆鍚屼嬌鐢⊿YN-cookie鐨凾CP鐩告瘮杈冿紝SCTP琚敾鍑昏呬吉瑁呯殑鍙兘鎬уぇ澶ч檷浣庛傚洜涓猴紝鏀誨嚮鑰呬笉寰椾笉鍘葷寽嫻嬪寘鍚湪cookie涓殑HMAC鍊箋傚彲鑳芥у皬浜?128銆?/p>


銆銆鍊煎緱娉ㄦ剰鐨勬槸錛孲CTP浠呬粎璇曞浘鏉ュ寮虹綉緇滅殑鍙敤鎬э紝瀹冩病鏈夊寘鍚換浣曠洿鎺ュ拰鐢ㄦ埛淇℃伅璁よ瘉銆佸畬鏁存у拰淇濆瘑鍔熻兘鐨勫崗璁満鍒訛紝鍥犱負榪欎簺鐗規т富瑕佸彇鍐充簬IPSec鍗忚鍜屽簲鐢ㄥ眰鍗忚鐨勫畨鍏ㄧ壒鎬с?/p>


6 SCTP涓嶵CP鐨勫姛鑳藉強搴旂敤姣旇緝


銆銆鐢變簬SCTP涔熸槸涓涓潰鍚戣繛鎺ョ殑鍗忚錛屽彲鎻愪緵鎵鏈塗CP鑳藉鎻愪緵鐨勪紶閫佸眰鏈嶅姟銆傚洜姝わ紝鐜版湁鐨勮澶欼nternet搴旂敤灝嗛潰涓撮夋嫨浣跨敤TCP鎴朣CTP錛屾潵婊¤凍浠栦滑瀵逛紶閫佸眰鏈嶅姟鐨勯渶姹傘傞渶瑕佹敞鎰忕殑鏄紝瀵瑰鐞嗘垚鏈瘮杈冩晱鎰熺殑搴旂敤錛屽湪浣跨敤SCTP鎴朤CP寰楀埌鐨勬湇鍔℃槸涓嶄竴鏍風殑錛孲CTP鍙互涓哄簲鐢ㄦ彁渚涗竴涓崟鐙畾鍒剁殑嫻佷紶杈擄紝鑰孴CP涓哄簲鐢ㄦ彁渚涚殑鏄竴瀵瑰湴鍧銆?/p>


銆銆褰撶劧錛孲CTP榪樺叿鏈変竴浜汿CP鎵涓嶅叿澶囩殑鍔熻兘錛岃繖鏍鳳紝鍦ㄦ煇浜涘簲鐢ㄥ満鍚堬紝閫夋嫨SCTP瀹炵幇浼犻佸眰鏈嶅姟灝嗘槸鏇村ソ鐨勯夋嫨銆係CTP鍦ㄤ竴涓繛鎺ヤ腑鍙互鏀寔澶氫釜鐙珛鐢ㄦ埛淇℃伅嫻佺殑鍙戦併傛紜嬌鐢ㄨ鍔熻兘錛屽彲浠ユ湁鏁堝噺灝戞墍璋撶殑“head-of-line-blocking”闂甯︽潵鐨勫獎鍝嶏紝鍦═CP涓嚭鐜拌闂錛屼富瑕佹槸鍥犱負鏁版嵁鍖呯殑鍙戦佹湁涓ユ牸鐨勯『搴忔帶鍒躲傚洜姝わ紝瀵歸偅浜涢渶瑕佸湪涓涓繛鎺ヤ腑鍚屾椂鏀寔澶氫釜閫昏緫涓婄嫭绔嬬殑淇℃伅嫻佷紶閫佺殑搴旂敤錛孲CTP灝辯壒鍒湁鐢ㄣ?br>銆銆SCTP淇濈暀鏈夊簲鐢ㄤ俊鎭殑杈圭晫銆傚綋搴旂敤鏁版嵁涓嶆槸榪炵畫鐨勫瓧鑺傛祦錛岃屾槸瑕佹帴鏀剁鍗曠嫭澶勭悊澶у潡鐨勬暟鎹寘鏃訛紝璇ュ姛鑳藉氨闈炲父鏈夌敤銆傜浉鍙嶏紝TCP鍦ㄦ彁渚涘彲闈犳暟鎹祦浼犻佺殑鍚屾椂錛屽茍涓嶈兘鎸囧嚭搴旂敤涓寘鍚殑澶у潡鏁版嵁鍖呫?/p>


銆銆SCTP鏀寔娌℃湁鎸囨槑搴旂敤綾誨埆鐨勭敤鎴蜂俊鎭殑浼犻侊紝鑰屼笖鑳藉淇濊瘉鏁版嵁鐨勫彲闈犱紶閫併傚閭d簺闇瑕佸彂閫佹病鏈夐『搴忕殑鍙潬淇℃伅嫻佺殑搴旂敤錛屾垨鑰呭枩嬈嬌鐢ㄨ嚜韜殑淇℃伅鎺掑簭鏈哄埗鐨勫簲鐢紝SCTP鐨勮繖涓姛鑳藉氨鐗瑰埆鏈夌敤銆?br>



Bugs 2008-06-26 11:28 鍙戣〃璇勮
]]>
Linux涓嬭緗甋hell鐨勯鑹詫紒http://www.shnenglu.com/Bugs/archive/2008/06/24/54442.htmlBugsBugsTue, 24 Jun 2008 03:06:00 GMThttp://www.shnenglu.com/Bugs/archive/2008/06/24/54442.htmlhttp://www.shnenglu.com/Bugs/comments/54442.htmlhttp://www.shnenglu.com/Bugs/archive/2008/06/24/54442.html#Feedback4http://www.shnenglu.com/Bugs/comments/commentRss/54442.htmlhttp://www.shnenglu.com/Bugs/services/trackbacks/54442.html  棣栧厛浣跨敤涓涓緥瀛愭潵璇存槑濡備綍瀹炵幇Shell褰╄壊錛?br>    PS1="\[ \033[0;32;40m\u@\h:\w\$ \033[0m \]"


   鍦ㄤ笂闈㈠懡浠や腑錛?#8220;\033[0;32;40m”琛ㄧず瀹氫箟鍚庨潰鏂囨湰鐨勯鑹詫紝“\033”琛ㄧず鍚姩涓涓漿涔夊簭鍒楋紝“[”瀹氫箟寮濮嬮鑹插畾涔夛紝“0”瀹氫箟榛樿鐨勫瓧浣撻鑹詫紝鍏跺畠閮ㄥ垎紼嶅悗瀹氫箟銆?br>    “32”瀹氫箟鏂囨湰鐨勫墠鏅壊錛岃繖閲?2琛ㄧず緇胯壊錛?#8220;40”瀹氫箟鏂囨湰鐨勮儗鏅壊錛?0琛ㄧず榛戣壊銆?br>    鍦ㄥ瓧絎︿覆鐨勬渶鍚庡畾涔変簡“ \033[0m”錛屽畠鏄敤鏉ユ仮澶嶄簡榛樿鐨勬枃鏈鑹茶緗紝榪欐牱灝卞彧浼氬緱鍒頒竴涓僵鑹叉彁紺虹錛岃屼笉浼氬獎鍝嶅懡浠ゅ拰鍏惰緭鍑虹殑棰滆壊鏄劇ず錛堝嵆榛戝簳鐧藉瓧錛夈?

    鎴戜滑涓鍏辨湁8縐嶅瓧浣撻鑹插彲渚涢夋嫨錛屽畠浠垎鍒槸30 (榛戣壊)銆?1 (綰㈣壊)銆?2 (緇胯壊)銆?3 (榛勮壊)銆?4 (钃濊壊)銆?5 ( 绱孩鑹?銆?6 (闈掕壊)鍜?7 (鐧借壊)銆?br>    瀵逛簬搴曡壊涔熸湁8縐嶉鑹插彲渚涢夋嫨錛屽彧闇瑕佸皢瀛椾綋棰滆壊鐨?淇敼涓?鍗沖彲錛屼緥濡?0銆?1銆?2銆?3銆?4銆?5銆?6銆?7銆?nbsp;

    鏂囨湰灞炴?

    鎴戜滑鍓嶉潰鎻愬埌錛岃漿涔夊簭鍒楃鍚庨潰鐨?#8220;0”琛ㄧず瀹氫箟鏂囨湰鐨勯鑹茶緗?br>    闄や簡棰滆壊璁劇疆浠ュ錛岃繕鍙互璁劇疆鏂囨湰鐨勫叾瀹冨睘鎬с?br>    杞箟搴忓垪絎﹀悗鍙互璺熶互涓嬫暟鍊鹼細0銆?銆?2銆?銆?4銆?銆?5銆?銆?7錛屽垎鍒畾涔夐鑹層侀粦浣撱侀潪榛戜綋銆佷笅鐢葷嚎銆侀潪涓嬬敾綰褲侀棯鐑併侀潪闂儊銆佺炕杞侀潪緲昏漿銆?br>



Bugs 2008-06-24 11:06 鍙戣〃璇勮
]]>
Epoll絎旇錛?/title><link>http://www.shnenglu.com/Bugs/archive/2008/06/23/54350.html</link><dc:creator>Bugs</dc:creator><author>Bugs</author><pubDate>Mon, 23 Jun 2008 02:17:00 GMT</pubDate><guid>http://www.shnenglu.com/Bugs/archive/2008/06/23/54350.html</guid><wfw:comment>http://www.shnenglu.com/Bugs/comments/54350.html</wfw:comment><comments>http://www.shnenglu.com/Bugs/archive/2008/06/23/54350.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/Bugs/comments/commentRss/54350.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Bugs/services/trackbacks/54350.html</trackback:ping><description><![CDATA[epoll鐨勬帴鍙i潪甯哥畝鍗曪紝涓鍏卞氨涓変釜鍑芥暟錛?br><span style="COLOR: rgb(255,1,2)">1. int epoll_create(int size);</span><br>鍒涘緩涓涓猠poll鐨勫彞鏌勶紝size鐢ㄦ潵鍛婅瘔鍐呮牳榪欎釜鐩戝惉鐨勬暟鐩竴鍏辨湁澶氬ぇ銆傝繖涓弬鏁頒笉鍚屼簬select()涓殑絎竴涓弬鏁幫紝緇欏嚭鏈澶х洃鍚殑fd+1鐨勫箋傞渶瑕佹敞鎰忕殑鏄紝褰撳垱寤哄ソepoll鍙ユ焺鍚庯紝瀹冨氨鏄細鍗犵敤涓涓猣d鍊鹼紝鍦╨inux涓嬪鏋滄煡鐪?proc/榪涚▼id/fd/錛屾槸鑳藉鐪嬪埌榪欎釜fd鐨勶紝鎵浠ュ湪浣跨敤瀹宔poll鍚庯紝蹇呴』璋冪敤close()鍏抽棴錛屽惁鍒欏彲鑳藉鑷磃d琚楀敖銆?br><br><br><span style="COLOR: rgb(255,1,2)">2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);</span><br>epoll鐨勪簨浠舵敞鍐屽嚱鏁幫紝瀹冧笉鍚屼笌select()鏄湪鐩戝惉浜嬩歡鏃跺憡璇夊唴鏍歌鐩戝惉浠涔堢被鍨嬬殑浜嬩歡錛岃屾槸鍦ㄨ繖閲屽厛娉ㄥ唽瑕佺洃鍚殑浜嬩歡綾誨瀷銆傜涓涓弬鏁版槸epoll_create()鐨勮繑鍥炲鹼紝絎簩涓弬鏁拌〃紺哄姩浣滐紝鐢ㄤ笁涓畯鏉ヨ〃紺猴細<br>EPOLL_CTL_ADD錛氭敞鍐屾柊鐨刦d鍒癳pfd涓紱<br>EPOLL_CTL_MOD錛氫慨鏀瑰凡緇忔敞鍐岀殑fd鐨勭洃鍚簨浠訛紱<br>EPOLL_CTL_DEL錛氫粠epfd涓垹闄や竴涓猣d錛?br>絎笁涓弬鏁版槸闇瑕佺洃鍚殑fd錛岀鍥涗釜鍙傛暟鏄憡璇夊唴鏍擱渶瑕佺洃鍚粈涔堜簨錛宻truct epoll_event緇撴瀯濡備笅錛?br>struct epoll_event {<br>  __uint32_t events;  /* Epoll events */<br>  epoll_data_t data;  /* User data variable */<br>};<br><br>events鍙互鏄互涓嬪嚑涓畯鐨勯泦鍚堬細<br>EPOLLIN 錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎﹀彲浠ヨ錛堝寘鎷绔疭OCKET姝e父鍏抽棴錛夛紱<br>EPOLLOUT錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎﹀彲浠ュ啓錛?br>EPOLLPRI錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎︽湁绱фョ殑鏁版嵁鍙錛堣繖閲屽簲璇ヨ〃紺烘湁甯﹀鏁版嵁鍒版潵錛夛紱<br>EPOLLERR錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎﹀彂鐢熼敊璇紱<br>EPOLLHUP錛氳〃紺哄搴旂殑鏂囦歡鎻忚堪絎﹁鎸傛柇錛?br>EPOLLET錛?灝咵POLL璁句負杈圭紭瑙﹀彂(Edge Triggered)妯″紡錛岃繖鏄浉瀵逛簬姘村鉤瑙﹀彂(Level Triggered)鏉ヨ鐨勩?br>EPOLLONESHOT錛氬彧鐩戝惉涓嬈′簨浠訛紝褰撶洃鍚畬榪欐浜嬩歡涔嬪悗錛屽鏋滆繕闇瑕佺戶緇洃鍚繖涓猻ocket鐨勮瘽錛岄渶瑕佸啀嬈℃妸榪欎釜socket鍔犲叆鍒癊POLL闃熷垪閲?br><br><br><span style="COLOR: rgb(255,1,2)">3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);</span><br>絳夊緟浜嬩歡鐨勪駭鐢燂紝綾諱技浜巗elect()璋冪敤銆傚弬鏁癳vents鐢ㄦ潵浠庡唴鏍稿緱鍒頒簨浠剁殑闆嗗悎錛宮axevents鍛婁箣鍐呮牳榪欎釜events鏈夊澶э紝榪欎釜maxevents鐨勫間笉鑳藉ぇ浜庡垱寤篹poll_create()鏃剁殑size錛屽弬鏁皌imeout鏄秴鏃舵椂闂達紙姣錛?浼氱珛鍗寵繑鍥烇紝-1灝嗕笉紜畾錛屼篃鏈夎娉曡鏄案涔呴樆濉烇級銆傝鍑芥暟榪斿洖闇瑕佸鐞嗙殑浜嬩歡鏁扮洰錛屽榪斿洖0琛ㄧず宸茶秴鏃躲?br><br>EPOLL浜嬩歡鏈変袱縐嶆ā鍨嬶細<br>Edge Triggered (ET)<br>Level Triggered (LT)<br><br>ET(edge-triggered)鏄珮閫熷伐浣滄柟寮忥紝鍙敮鎸乶o-block socket銆傚湪榪欑妯″紡涓嬶紝褰撴弿榪扮浠庢湭灝辯華鍙樹負灝辯華鏃訛紝鍐呮牳閫氳繃epoll鍛婅瘔浣犮傜劧鍚庡畠浼氬亣璁句綘鐭ラ亾鏂囦歡鎻忚堪絎﹀凡緇忓氨緇紝騫朵笖涓嶄細鍐嶄負閭d釜鏂囦歡鎻忚堪絎﹀彂閫佹洿澶氱殑灝辯華閫氱煡錛岀洿鍒頒綘鍋氫簡鏌愪簺鎿嶄綔瀵艱嚧閭d釜鏂囦歡鎻忚堪絎︿笉鍐嶄負灝辯華鐘舵佷簡(姣斿錛屼綘鍦ㄥ彂閫侊紝鎺ユ敹鎴栬呮帴鏀惰姹傦紝鎴栬呭彂閫佹帴鏀剁殑鏁版嵁灝戜簬涓瀹氶噺鏃跺鑷翠簡涓涓狤WOULDBLOCK 閿欒錛夈備絾鏄娉ㄦ剰錛屽鏋滀竴鐩翠笉瀵硅繖涓猣d浣淚O鎿嶄綔(浠庤屽鑷村畠鍐嶆鍙樻垚鏈氨緇?錛屽唴鏍鎬笉浼氬彂閫佹洿澶氱殑閫氱煡(only once),<span style="FONT-WEIGHT: bold; FONT-STYLE: italic">涓嶈繃鍦═CP鍗忚涓紝ET妯″紡鐨勫姞閫熸晥鐢ㄤ粛闇瑕佹洿澶氱殑benchmark紜<br><br>鍙﹀錛屽綋浣跨敤epoll鐨凟T妯″瀷鏉ュ伐浣滄椂錛屽綋浜х敓浜嗕竴涓狤POLLIN浜嬩歡鍚庯紝<br><span style="COLOR: rgb(255,1,2)">璇繪暟鎹殑鏃跺欓渶瑕佽冭檻鐨勬槸褰搑ecv()榪斿洖鐨勫ぇ灝忓鏋滅瓑浜庤姹傜殑澶у皬錛岄偅涔堝緢鏈夊彲鑳芥槸緙撳啿鍖鴻繕鏈夋暟鎹湭璇誨畬錛屼篃鎰忓懗鐫璇ユ浜嬩歡榪樻病鏈夊鐞嗗畬錛屾墍浠ヨ繕闇瑕佸啀嬈¤鍙?/span>錛?br>while(rs)<br>{<br>  buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);<br>  if(buflen < 0)<br>  {<br>    // 鐢變簬鏄潪闃誨鐨勬ā寮?鎵浠ュ綋errno涓篍AGAIN鏃?琛ㄧず褰撳墠緙撳啿鍖哄凡鏃犳暟鎹彲璇?br>    // 鍦ㄨ繖閲屽氨褰撲綔鏄嬈′簨浠跺凡澶勭悊澶?<br>    if(errno == EAGAIN)<br>     break;<br>    else<br>     return;<br>   }<br>   else if(buflen == 0)<br>   {<br>     // 榪欓噷琛ㄧず瀵圭鐨剆ocket宸叉甯稿叧闂?<br>   }<br><span style="COLOR: rgb(255,1,2)">   if(buflen == sizeof(buf)</span><br style="COLOR: rgb(255,1,2)"><span style="COLOR: rgb(255,1,2)">     rs = 1;   // 闇瑕佸啀嬈¤鍙?/span><br>   else<br>     rs = 0;<br>}<br><br><br><span style="FONT-WEIGHT: bold; COLOR: rgb(255,1,2)">榪樻湁錛屽亣濡傚彂閫佺嫻侀噺澶т簬鎺ユ敹绔殑嫻侀噺(鎰忔濇槸epoll鎵鍦ㄧ殑紼嬪簭璇繪瘮杞彂鐨剆ocket瑕佸揩),鐢變簬鏄潪闃誨鐨剆ocket,閭d箞send()鍑芥暟铏界劧榪斿洖,浣嗗疄闄呯紦鍐插尯鐨勬暟鎹茍鏈湡姝e彂緇欐帴鏀剁,榪欐牱涓嶆柇鐨勮鍜屽彂錛屽綋緙撳啿鍖烘弧鍚庝細浜х敓EAGAIN閿欒(鍙傝僲an send),鍚屾椂,涓嶇悊浼氳繖嬈¤姹傚彂閫佺殑鏁版嵁.鎵浠?闇瑕佸皝瑁卻ocket_send()鐨勫嚱鏁扮敤鏉ュ鐞嗚繖縐嶆儏鍐?璇ュ嚱鏁頒細灝介噺灝嗘暟鎹啓瀹屽啀榪斿洖錛岃繑鍥?1琛ㄧず鍑洪敊銆傚湪socket_send()鍐呴儴,褰撳啓緙撳啿宸叉弧(send()榪斿洖-1,涓攅rrno涓篍AGAIN),閭d箞浼氱瓑寰呭悗鍐嶉噸璇?榪欑鏂瑰紡騫朵笉寰堝畬緹?鍦ㄧ悊璁轟笂鍙兘浼氶暱鏃墮棿鐨勯樆濉炲湪socket_send()鍐呴儴,浣嗘殏娌℃湁鏇村ソ鐨勫姙娉?</span><br><br>ssize_t socket_send(int sockfd, const char* buffer, size_t buflen)<br>{<br>  ssize_t tmp;<br>  size_t total = buflen;<br>  const char *p = buffer;<br><br>  while(1)<br>  {<br>    tmp = send(sockfd, p, total, 0);<br>    if(tmp < 0)<br>    {<br>      // 褰搒end鏀跺埌淇″彿鏃?鍙互緇х畫鍐?浣嗚繖閲岃繑鍥?1.<br>      if(errno == EINTR)<br>        return -1;<br><br>      // 褰搒ocket鏄潪闃誨鏃?濡傝繑鍥炴閿欒,琛ㄧず鍐欑紦鍐查槦鍒楀凡婊?<br>      // 鍦ㄨ繖閲屽仛寤舵椂鍚庡啀閲嶈瘯.<br>      if(errno == EAGAIN)<br>      {<br>        usleep(1000);<br>        continue;<br>      }<br><br>      return -1;<br>    }<br><br>    if((size_t)tmp == total)<br>      return buflen;<br><br>    total -= tmp;<br>    p += tmp;<br>  }<br><br>  return tmp;<br>} </span> <img src ="http://www.shnenglu.com/Bugs/aggbug/54350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Bugs/" target="_blank">Bugs</a> 2008-06-23 10:17 <a href="http://www.shnenglu.com/Bugs/archive/2008/06/23/54350.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>銆愯漿杞姐戜嬌鐢ㄥ紓姝?I/O 澶уぇ鎻愰珮搴旂敤紼嬪簭鐨勬ц兘http://www.shnenglu.com/Bugs/archive/2008/06/19/54038.htmlBugsBugsThu, 19 Jun 2008 09:53:00 GMThttp://www.shnenglu.com/Bugs/archive/2008/06/19/54038.htmlhttp://www.shnenglu.com/Bugs/comments/54038.htmlhttp://www.shnenglu.com/Bugs/archive/2008/06/19/54038.html#Feedback0http://www.shnenglu.com/Bugs/comments/commentRss/54038.htmlhttp://www.shnenglu.com/Bugs/services/trackbacks/54038.htmlhttp://www.ibm.com/developerworks/cn/linux/l-async/

浣跨敤寮傛 I/O 澶уぇ鎻愰珮搴旂敤紼嬪簭鐨勬ц兘

瀛︿範浣曟椂浠ュ強濡備綍浣跨敤 POSIX AIO API

developerWorks
鏂囨。閫夐」
灝嗘欏典綔涓虹數瀛愰偖浠跺彂閫?src="http://www.ibm.com/i/v14/icons/em.gif"

灝嗘欏典綔涓虹數瀛愰偖浠跺彂閫?/font>


綰у埆錛?涓駭

M. Tim Jones (mtj@mtjones.com), 欏鵑棶宸ョ▼甯? Emulex

2006 騫?9 鏈?28 鏃?/p>

Linux® 涓渶甯哥敤鐨勮緭鍏?杈撳嚭錛圛/O錛夋ā鍨嬫槸鍚屾 I/O銆傚湪榪欎釜妯″瀷涓紝褰撹姹傚彂鍑轟箣鍚庯紝搴旂敤紼嬪簭灝變細闃誨錛岀洿鍒拌姹傛弧瓚充負姝€傝繖鏄緢濂界殑涓縐嶈В鍐蟲柟妗堬紝鍥犱負璋冪敤搴旂敤紼嬪簭鍦ㄧ瓑寰?I/O 璇鋒眰瀹屾垚鏃朵笉闇瑕佷嬌鐢ㄤ換浣曚腑澶鐞嗗崟鍏冿紙CPU錛夈備絾鏄湪鏌愪簺鎯呭喌涓紝I/O 璇鋒眰鍙兘闇瑕佷笌鍏朵粬榪涚▼浜х敓浜ゅ彔銆傚彲縐繪鎿嶄綔緋葷粺鎺ュ彛錛圥OSIX錛夊紓姝?I/O錛圓IO錛夊簲鐢ㄧ▼搴忔帴鍙o紙API錛夊氨鎻愪緵浜嗚繖縐嶅姛鑳姐傚湪鏈枃涓紝鎴戜滑灝嗗榪欎釜 API 姒傝榪涜浠嬬粛錛屽茍鏉ヤ簡瑙d竴涓嬪浣曚嬌鐢ㄥ畠銆?/blockquote>

AIO 綆浠?

Linux 寮傛 I/O 鏄?Linux 鍐呮牳涓彁渚涚殑涓涓浉褰撴柊鐨勫寮恒傚畠鏄?2.6 鐗堟湰鍐呮牳鐨勪竴涓爣鍑嗙壒鎬э紝浣嗘槸鎴戜滑鍦?2.4 鐗堟湰鍐呮牳鐨勮ˉ涓佷腑涔熷彲浠ユ壘鍒板畠銆侫IO 鑳屽悗鐨勫熀鏈濇兂鏄厑璁歌繘紼嬪彂璧峰緢澶?I/O 鎿嶄綔錛岃屼笉鐢ㄩ樆濉炴垨絳夊緟浠諱綍鎿嶄綔瀹屾垚銆傜◢鍚庢垨鍦ㄦ帴鏀跺埌 I/O 鎿嶄綔瀹屾垚鐨勯氱煡鏃訛紝榪涚▼灝卞彲浠ユ绱?I/O 鎿嶄綔鐨勭粨鏋溿?/p>

I/O 妯″瀷

鍦ㄦ繁鍏ヤ粙緇?AIO API 涔嬪墠錛岃鎴戜滑鍏堟潵鎺㈢儲涓涓?Linux 涓婂彲浠ヤ嬌鐢ㄧ殑涓嶅悓 I/O 妯″瀷銆傝繖騫朵笉鏄竴涓灝界殑浠嬬粛錛屼絾鏄垜浠皢璇曞浘浠嬬粛鏈甯哥敤鐨勪竴浜涙ā鍨嬫潵瑙i噴瀹冧滑涓庡紓姝?I/O 涔嬮棿鐨勫尯鍒傚浘 1 緇欏嚭浜嗗悓姝ュ拰寮傛妯″瀷錛屼互鍙婇樆濉炲拰闈為樆濉炵殑妯″瀷銆?/p>
鍥?1. 鍩烘湰 Linux I/O 妯″瀷鐨勭畝鍗曠煩闃?/strong>
鍩烘湰 Linux I/O 妯″瀷鐨勭畝鍗曠煩闃? src=

姣忎釜 I/O 妯″瀷閮芥湁鑷繁鐨勪嬌鐢ㄦā寮忥紝瀹冧滑瀵逛簬鐗瑰畾鐨勫簲鐢ㄧ▼搴忛兘鏈夎嚜宸辯殑浼樼偣銆傛湰鑺傚皢綆瑕佸鍏朵竴涓榪涜浠嬬粛銆?/p>

鍚屾闃誨 I/O

I/O 瀵嗛泦鍨嬩笌 CPU 瀵嗛泦鍨嬭繘紼嬬殑姣旇緝

I/O 瀵嗛泦鍨嬭繘紼嬫墍鎵ц鐨?I/O 鎿嶄綔姣旀墽琛岀殑澶勭悊鎿嶄綔鏇村銆侰PU 瀵嗛泦鍨嬬殑榪涚▼鎵鎵ц鐨勫鐞嗘搷浣滄瘮 I/O 鎿嶄綔鏇村銆侺inux 2.6 鐨勮皟搴﹀櫒瀹為檯涓婃洿鍔犲亸鐖?I/O 瀵嗛泦鍨嬬殑榪涚▼錛屽洜涓哄畠浠氬父浼氬彂璧蜂竴涓?I/O 鎿嶄綔錛岀劧鍚庤繘琛岄樆濉烇紝榪欏氨鎰忓懗鐫鍏朵粬宸ヤ綔閮藉彲浠ュ湪涓よ呬箣闂存湁鏁堝湴浜ら敊榪涜銆?/p>

鏈甯哥敤鐨勪竴涓ā鍨嬫槸鍚屾闃誨 I/O 妯″瀷銆傚湪榪欎釜妯″瀷涓紝鐢ㄦ埛絀洪棿鐨勫簲鐢ㄧ▼搴忔墽琛屼竴涓郴緇熻皟鐢紝榪欎細瀵艱嚧搴旂敤紼嬪簭闃誨銆傝繖鎰忓懗鐫搴旂敤紼嬪簭浼氫竴鐩撮樆濉烇紝鐩村埌緋葷粺璋冪敤瀹屾垚涓烘錛堟暟鎹紶杈撳畬鎴愭垨鍙戠敓閿欒錛夈傝皟鐢ㄥ簲鐢ㄧ▼搴忓浜庝竴縐嶄笉鍐嶆秷璐?CPU 鑰屽彧鏄畝鍗曠瓑寰呭搷搴旂殑鐘舵侊紝鍥犳浠庡鐞嗙殑瑙掑害鏉ョ湅錛岃繖鏄潪甯告湁鏁堢殑銆?/p>

鍥?2 緇欏嚭浜嗕紶緇熺殑闃誨 I/O 妯″瀷錛岃繖涔熸槸鐩墠搴旂敤紼嬪簭涓渶涓哄父鐢ㄧ殑涓縐嶆ā鍨嬨傚叾琛屼負闈炲父瀹規槗鐞嗚В錛屽叾鐢ㄦ硶瀵逛簬鍏稿瀷鐨勫簲鐢ㄧ▼搴忔潵璇撮兘闈炲父鏈夋晥銆傚湪璋冪敤 read 緋葷粺璋冪敤鏃訛紝搴旂敤紼嬪簭浼氶樆濉炲茍瀵瑰唴鏍歌繘琛屼笂涓嬫枃鍒囨崲銆傜劧鍚庝細瑙﹀彂璇繪搷浣滐紝褰撳搷搴旇繑鍥炴椂錛堜粠鎴戜滑姝e湪浠庝腑璇誨彇鐨勮澶囦腑榪斿洖錛夛紝鏁版嵁灝辮縐誨姩鍒扮敤鎴風┖闂寸殑緙撳啿鍖轟腑銆傜劧鍚庡簲鐢ㄧ▼搴忓氨浼氳В闄ら樆濉烇紙read 璋冪敤榪斿洖錛夈?/p>
鍥?2. 鍚屾闃誨 I/O 妯″瀷鐨勫吀鍨嬫祦紼?/strong>
鍚屾闃誨 I/O 妯″瀷鐨勫吀鍨嬫祦紼? src=

浠庡簲鐢ㄧ▼搴忕殑瑙掑害鏉ヨ錛?code>read 璋冪敤浼氬歡緇緢闀挎椂闂淬傚疄闄呬笂錛屽湪鍐呮牳鎵ц璇繪搷浣滃拰鍏朵粬宸ヤ綔鏃訛紝搴旂敤紼嬪簭鐨勭‘浼氳闃誨銆?/p>

鍚屾闈為樆濉?I/O

鍚屾闃誨 I/O 鐨勪竴縐嶆晥鐜囩◢浣庣殑鍙樼鏄悓姝ラ潪闃誨 I/O銆傚湪榪欑妯″瀷涓紝璁懼鏄互闈為樆濉炵殑褰㈠紡鎵撳紑鐨勩傝繖鎰忓懗鐫 I/O 鎿嶄綔涓嶄細绔嬪嵆瀹屾垚錛?code>read 鎿嶄綔鍙兘浼氳繑鍥炰竴涓敊璇唬鐮侊紝璇存槑榪欎釜鍛戒護涓嶈兘绔嬪嵆婊¤凍錛?code>EAGAIN 鎴?EWOULDBLOCK錛夛紝濡傚浘 3 鎵紺恒?/p>
鍥?3. 鍚屾闈為樆濉?I/O 妯″瀷鐨勫吀鍨嬫祦紼?/strong>
鍚屾闈為樆濉?I/O 妯″瀷鐨勫吀鍨嬫祦紼? src=

闈為樆濉炵殑瀹炵幇鏄?I/O 鍛戒護鍙兘騫朵笉浼氱珛鍗蟲弧瓚籌紝闇瑕佸簲鐢ㄧ▼搴忚皟鐢ㄨ澶氭鏉ョ瓑寰呮搷浣滃畬鎴愩傝繖鍙兘鏁堢巼涓嶉珮錛屽洜涓哄湪寰堝鎯呭喌涓嬶紝褰撳唴鏍告墽琛岃繖涓懡浠ゆ椂錛屽簲鐢ㄧ▼搴忓繀欏昏榪涜蹇欑絳夊緟錛岀洿鍒版暟鎹彲鐢ㄤ負姝紝鎴栬呰瘯鍥炬墽琛屽叾浠栧伐浣溿傛濡傚浘 3 鎵紺虹殑涓鏍鳳紝榪欎釜鏂規硶鍙互寮曞叆 I/O 鎿嶄綔鐨勫歡鏃訛紝鍥犱負鏁版嵁鍦ㄥ唴鏍鎬腑鍙樹負鍙敤鍒扮敤鎴瘋皟鐢?read 榪斿洖鏁版嵁涔嬮棿瀛樺湪涓瀹氱殑闂撮殧錛岃繖浼氬鑷存暣浣撴暟鎹悶鍚愰噺鐨勯檷浣庛?/p>

寮傛闃誨 I/O

鍙﹀涓涓樆濉炶В鍐蟲柟妗堟槸甯︽湁闃誨閫氱煡鐨勯潪闃誨 I/O銆傚湪榪欑妯″瀷涓紝閰嶇疆鐨勬槸闈為樆濉?I/O錛岀劧鍚庝嬌鐢ㄩ樆濉?select 緋葷粺璋冪敤鏉ョ‘瀹氫竴涓?I/O 鎻忚堪絎︿綍鏃舵湁鎿嶄綔銆備嬌 select 璋冪敤闈炲父鏈夎叮鐨勬槸瀹冨彲浠ョ敤鏉ヤ負澶氫釜鎻忚堪絎︽彁渚涢氱煡錛岃屼笉浠呬粎涓轟竴涓弿榪扮鎻愪緵閫氱煡銆傚浜庢瘡涓彁紺虹鏉ヨ錛屾垜浠彲浠ヨ姹傝繖涓弿榪扮鍙互鍐欐暟鎹佹湁璇繪暟鎹彲鐢ㄤ互鍙婃槸鍚﹀彂鐢熼敊璇殑閫氱煡銆?/p>
鍥?4. 寮傛闃誨 I/O 妯″瀷鐨勫吀鍨嬫祦紼?(select)
寮傛闃誨 I/O 妯″瀷鐨勫吀鍨嬫祦紼? src=

select 璋冪敤鐨勪富瑕侀棶棰樻槸瀹冪殑鏁堢巼涓嶆槸闈炲父楂樸傚敖綆¤繖鏄紓姝ラ氱煡浣跨敤鐨勪竴縐嶆柟渚挎ā鍨嬶紝浣嗘槸瀵逛簬楂樻ц兘鐨?I/O 鎿嶄綔鏉ヨ涓嶅緩璁嬌鐢ㄣ?/p>

寮傛闈為樆濉?I/O錛圓IO錛?

鏈鍚庯紝寮傛闈為樆濉?I/O 妯″瀷鏄竴縐嶅鐞嗕笌 I/O 閲嶅彔榪涜鐨勬ā鍨嬨傝璇鋒眰浼氱珛鍗寵繑鍥烇紝璇存槑 read 璇鋒眰宸茬粡鎴愬姛鍙戣搗浜嗐傚湪鍚庡彴瀹屾垚璇繪搷浣滄椂錛屽簲鐢ㄧ▼搴忕劧鍚庝細鎵ц鍏朵粬澶勭悊鎿嶄綔銆傚綋 read 鐨勫搷搴斿埌杈炬椂錛屽氨浼氫駭鐢熶竴涓俊鍙鋒垨鎵ц涓涓熀浜庣嚎紼嬬殑鍥炶皟鍑芥暟鏉ュ畬鎴愯繖嬈?I/O 澶勭悊榪囩▼銆?/p>
鍥?5. 寮傛闈為樆濉?I/O 妯″瀷鐨勫吀鍨嬫祦紼?/strong>
寮傛闈為樆濉?I/O 妯″瀷鐨勫吀鍨嬫祦紼? src=

鍦ㄤ竴涓繘紼嬩腑涓轟簡鎵ц澶氫釜 I/O 璇鋒眰鑰屽璁$畻鎿嶄綔鍜?I/O 澶勭悊榪涜閲嶅彔澶勭悊鐨勮兘鍔涘埄鐢ㄤ簡澶勭悊閫熷害涓?I/O 閫熷害涔嬮棿鐨勫樊寮傘傚綋涓涓垨澶氫釜 I/O 璇鋒眰鎸傝搗鏃訛紝CPU 鍙互鎵ц鍏朵粬浠誨姟錛涙垨鑰呮洿涓哄父瑙佺殑鏄紝鍦ㄥ彂璧峰叾浠?I/O 鐨勫悓鏃跺宸茬粡瀹屾垚鐨?I/O 榪涜鎿嶄綔銆?/p>

涓嬩竴鑺傚皢娣卞叆浠嬬粛榪欑妯″瀷錛屾帰绱㈣繖縐嶆ā鍨嬩嬌鐢ㄧ殑 API錛岀劧鍚庡睍紺哄嚑涓懡浠ゃ?/p>



鍥為〉棣?/font>


寮傛 I/O 鐨勫姩鏈?

浠庡墠闈?I/O 妯″瀷鐨勫垎綾諱腑錛屾垜浠彲浠ョ湅鍑?AIO 鐨勫姩鏈恒傝繖縐嶉樆濉炴ā鍨嬮渶瑕佸湪 I/O 鎿嶄綔寮濮嬫椂闃誨搴旂敤紼嬪簭銆傝繖鎰忓懗鐫涓嶅彲鑳藉悓鏃墮噸鍙犺繘琛屽鐞嗗拰 I/O 鎿嶄綔銆傚悓姝ラ潪闃誨妯″瀷鍏佽澶勭悊鍜?I/O 鎿嶄綔閲嶅彔榪涜錛屼絾鏄繖闇瑕佸簲鐢ㄧ▼搴忔牴鎹噸鐜扮殑瑙勫垯鏉ユ鏌?I/O 鎿嶄綔鐨勭姸鎬併傝繖鏍峰氨鍓╀笅寮傛闈為樆濉?I/O 浜嗭紝瀹冨厑璁稿鐞嗗拰 I/O 鎿嶄綔閲嶅彔榪涜錛屽寘鎷?I/O 鎿嶄綔瀹屾垚鐨勯氱煡銆?/p>

闄や簡闇瑕侀樆濉炰箣澶栵紝select 鍑芥暟鎵鎻愪緵鐨勫姛鑳斤紙寮傛闃誨 I/O錛変笌 AIO 綾諱技銆備笉榪囷紝瀹冩槸瀵歸氱煡浜嬩歡榪涜闃誨錛岃屼笉鏄 I/O 璋冪敤榪涜闃誨銆?/p>



鍥為〉棣?/font>


Linux 涓婄殑 AIO 綆浠?

鏈妭灝嗘帰绱?Linux 鐨勫紓姝?I/O 妯″瀷錛屼粠鑰屽府鍔╂垜浠悊瑙e浣曞湪搴旂敤紼嬪簭涓嬌鐢ㄨ繖縐嶆妧鏈?/p>

鍦ㄤ紶緇熺殑 I/O 妯″瀷涓紝鏈変竴涓嬌鐢ㄦ儫涓鍙ユ焺鏍囪瘑鐨?I/O 閫氶亾銆傚湪 UNIX® 涓紝榪欎簺鍙ユ焺鏄枃浠舵弿榪扮錛堣繖瀵圭瓑鍚屼簬鏂囦歡銆佺閬撱佸鎺ュ瓧絳夌瓑錛夈傚湪闃誨 I/O 涓紝鎴戜滑鍙戣搗浜嗕竴嬈′紶杈撴搷浣滐紝褰撲紶杈撴搷浣滃畬鎴愭垨鍙戠敓閿欒鏃訛紝緋葷粺璋冪敤灝變細榪斿洖銆?/p>
Linux 涓婄殑 AIO

AIO 鍦?2.5 鐗堟湰鐨勫唴鏍鎬腑棣栨鍑虹幇錛岀幇鍦ㄥ凡緇忔槸 2.6 鐗堟湰鐨勪駭鍝佸唴鏍哥殑涓涓爣鍑嗙壒鎬т簡銆?/p>

鍦ㄥ紓姝ラ潪闃誨 I/O 涓紝鎴戜滑鍙互鍚屾椂鍙戣搗澶氫釜浼犺緭鎿嶄綔銆傝繖闇瑕佹瘡涓紶杈撴搷浣滈兘鏈夋儫涓鐨勪笂涓嬫枃錛岃繖鏍鋒垜浠墠鑳藉湪瀹冧滑瀹屾垚鏃跺尯鍒嗗埌搴曟槸鍝釜浼犺緭鎿嶄綔瀹屾垚浜嗐傚湪 AIO 涓紝榪欐槸涓涓?aiocb錛圓IO I/O Control Block錛夌粨鏋勩傝繖涓粨鏋勫寘鍚簡鏈夊叧浼犺緭鐨勬墍鏈変俊鎭紝鍖呮嫭涓烘暟鎹噯澶囩殑鐢ㄦ埛緙撳啿鍖恒傚湪浜х敓 I/O 錛堢О涓哄畬鎴愶級閫氱煡鏃訛紝aiocb 緇撴瀯灝辮鐢ㄦ潵鎯熶竴鏍囪瘑鎵瀹屾垚鐨?I/O 鎿嶄綔銆傝繖涓?API 鐨勫睍紺烘樉紺轟簡濡備綍浣跨敤瀹冦?/p>



鍥為〉棣?/font>


AIO API

AIO 鎺ュ彛鐨?API 闈炲父綆鍗曪紝浣嗘槸瀹冧負鏁版嵁浼犺緭鎻愪緵浜嗗繀闇鐨勫姛鑳斤紝騫剁粰鍑轟簡涓や釜涓嶅悓鐨勯氱煡妯″瀷銆傝〃 1 緇欏嚭浜?AIO 鐨勬帴鍙e嚱鏁幫紝鏈妭紼嶅悗浼氭洿璇︾粏榪涜浠嬬粛銆?/p>
琛?1. AIO 鎺ュ彛 API
API 鍑芥暟 璇存槑
aio_read 璇鋒眰寮傛璇繪搷浣?/td>
aio_error 媯鏌ュ紓姝ヨ姹傜殑鐘舵?/td>
aio_return 鑾峰緱瀹屾垚鐨勫紓姝ヨ姹傜殑榪斿洖鐘舵?/td>
aio_write 璇鋒眰寮傛鍐欐搷浣?/td>
aio_suspend 鎸傝搗璋冪敤榪涚▼錛岀洿鍒頒竴涓垨澶氫釜寮傛璇鋒眰宸茬粡瀹屾垚錛堟垨澶辮觸錛?/td>
aio_cancel 鍙栨秷寮傛 I/O 璇鋒眰
lio_listio 鍙戣搗涓緋誨垪 I/O 鎿嶄綔

姣忎釜 API 鍑芥暟閮戒嬌鐢?aiocb 緇撴瀯寮濮嬫垨媯鏌ャ傝繖涓粨鏋勬湁寰堝鍏冪礌錛屼絾鏄竻鍗?1 浠呬粎緇欏嚭浜嗛渶瑕侊紙鎴栧彲浠ワ級浣跨敤鐨勫厓绱犮?/p>
娓呭崟 1. aiocb 緇撴瀯涓浉鍏崇殑鍩?
                        struct aiocb {
                        int aio_fildes;               // File Descriptor
                        int aio_lio_opcode;           // Valid only for lio_listio (r/w/nop)
                        volatile void *aio_buf;       // Data Buffer
                        size_t aio_nbytes;            // Number of Bytes in Data Buffer
                        struct sigevent aio_sigevent; // Notification Structure
                        /* Internal fields */
                        ...
                        };
                        

sigevent 緇撴瀯鍛婅瘔 AIO 鍦?I/O 鎿嶄綔瀹屾垚鏃跺簲璇ユ墽琛屼粈涔堟搷浣溿傛垜浠皢鍦?AIO 鐨勫睍紺轟腑瀵硅繖涓粨鏋勮繘琛屾帰绱€傜幇鍦ㄦ垜浠皢灞曠ず鍚勪釜 AIO 鐨?API 鍑芥暟鏄浣曞伐浣滅殑錛屼互鍙婃垜浠簲璇ュ浣曚嬌鐢ㄥ畠浠?/p>

aio_read

aio_read 鍑芥暟璇鋒眰瀵逛竴涓湁鏁堢殑鏂囦歡鎻忚堪絎﹁繘琛屽紓姝ヨ鎿嶄綔銆傝繖涓枃浠舵弿榪扮鍙互琛ㄧず涓涓枃浠躲佸鎺ュ瓧鐢氳嚦綆¢亾銆?code>aio_read 鍑芥暟鐨勫師鍨嬪涓嬶細

int aio_read( struct aiocb *aiocbp );
                        

aio_read 鍑芥暟鍦ㄨ姹傝繘琛屾帓闃熶箣鍚庝細绔嬪嵆榪斿洖銆傚鏋滄墽琛屾垚鍔燂紝榪斿洖鍊煎氨涓?0錛涘鏋滃嚭鐜伴敊璇紝榪斿洖鍊煎氨涓?-1錛屽茍璁劇疆 errno 鐨勫箋?/p>

瑕佹墽琛岃鎿嶄綔錛屽簲鐢ㄧ▼搴忓繀欏誨 aiocb 緇撴瀯榪涜鍒濆鍖栥備笅闈㈣繖涓畝鐭殑渚嬪瓙灝卞睍紺轟簡濡備綍濉厖 aiocb 璇鋒眰緇撴瀯錛屽茍浣跨敤 aio_read 鏉ユ墽琛屽紓姝ヨ璇鋒眰錛堢幇鍦ㄦ殏鏃跺拷鐣ラ氱煡錛夋搷浣溿傚畠榪樺睍紺轟簡 aio_error 鐨勭敤娉曪紝涓嶈繃鎴戜滑灝嗙◢鍚庡啀浣滆В閲娿?/p>
娓呭崟 2. 浣跨敤 aio_read 榪涜寮傛璇繪搷浣滅殑渚嬪瓙
                        #include <aio.h>
                        ...
                        int fd, ret;
                        struct aiocb my_aiocb;
                        fd = open( "file.txt", O_RDONLY );
                        if (fd < 0) perror("open");
                        /* Zero out the aiocb structure (recommended) */
                        bzero( (char *)&my_aiocb, sizeof(struct aiocb) );
                        /* Allocate a data buffer for the aiocb request */
                        my_aiocb.aio_buf = malloc(BUFSIZE+1);
                        if (!my_aiocb.aio_buf) perror("malloc");
                        /* Initialize the necessary fields in the aiocb */
                        my_aiocb.aio_fildes = fd;
                        my_aiocb.aio_nbytes = BUFSIZE;
                        my_aiocb.aio_offset = 0;
                        ret = aio_read( &my_aiocb );
                        if (ret < 0) perror("aio_read");
                        while ( aio_error( &my_aiocb ) == EINPROGRESS ) ;
                        if ((ret = aio_return( &my_iocb )) > 0) {
                        /* got ret bytes on the read */
                        } else {
                        /* read failed, consult errno */
                        }
                        

鍦ㄦ竻鍗?2 涓紝鍦ㄦ墦寮瑕佷粠涓鍙栨暟鎹殑鏂囦歡涔嬪悗錛屾垜浠氨娓呯┖浜?aiocb 緇撴瀯錛岀劧鍚庡垎閰嶄竴涓暟鎹紦鍐插尯銆傚茍灝嗗榪欎釜鏁版嵁緙撳啿鍖虹殑寮曠敤鏀懼埌 aio_buf 涓傜劧鍚庯紝鎴戜滑灝?aio_nbytes 鍒濆鍖栨垚緙撳啿鍖虹殑澶у皬銆傚茍灝?aio_offset 璁劇疆鎴?0錛堣鏂囦歡涓殑絎竴涓亸縐婚噺錛夈傛垜浠皢 aio_fildes 璁劇疆涓轟粠涓鍙栨暟鎹殑鏂囦歡鎻忚堪絎︺傚湪璁劇疆榪欎簺鍩熶箣鍚庯紝灝辮皟鐢?aio_read 璇鋒眰榪涜璇繪搷浣溿傛垜浠劧鍚庡彲浠ヨ皟鐢?aio_error 鏉ョ‘瀹?aio_read 鐨勭姸鎬併傚彧瑕佺姸鎬佹槸 EINPROGRESS錛屽氨涓鐩村繖紕岀瓑寰咃紝鐩村埌鐘舵佸彂鐢熷彉鍖栦負姝€傜幇鍦紝璇鋒眰鍙兘鎴愬姛錛屼篃鍙兘澶辮觸銆?/p>
浣跨敤 AIO 鎺ュ彛鏉ョ紪璇戠▼搴?/strong>

鎴戜滑鍙互鍦?aio.h 澶存枃浠朵腑鎵懼埌鍑芥暟鍘熷瀷鍜屽叾浠栭渶瑕佺殑絎﹀彿銆傚湪緙栬瘧浣跨敤榪欑鎺ュ彛鐨勭▼搴忔椂錛屾垜浠繀欏諱嬌鐢?POSIX 瀹炴椂鎵╁睍搴擄紙librt錛夈?/p>

娉ㄦ剰浣跨敤榪欎釜 API 涓庢爣鍑嗙殑搴撳嚱鏁頒粠鏂囦歡涓鍙栧唴瀹規槸闈炲父鐩鎬技鐨勩傞櫎浜?aio_read 鐨勪竴浜涘紓姝ョ壒鎬т箣澶栵紝鍙﹀涓涓尯鍒槸璇繪搷浣滃亸縐婚噺鐨勮緗傚湪浼犵粺鐨?read 璋冪敤涓紝鍋忕Щ閲忔槸鍦ㄦ枃浠舵弿榪扮涓婁笅鏂囦腑榪涜緇存姢鐨勩傚浜庢瘡涓鎿嶄綔鏉ヨ錛屽亸縐婚噺閮介渶瑕佽繘琛屾洿鏂幫紝榪欐牱鍚庣畫鐨勮鎿嶄綔鎵嶈兘瀵逛笅涓鍧楁暟鎹繘琛屽鍧銆傚浜庡紓姝?I/O 鎿嶄綔鏉ヨ榪欐槸涓嶅彲鑳界殑錛屽洜涓烘垜浠彲浠ュ悓鏃舵墽琛屽緢澶氳璇鋒眰錛屽洜姝ゅ繀欏諱負姣忎釜鐗瑰畾鐨勮璇鋒眰閮芥寚瀹氬亸縐婚噺銆?/p>

aio_error

aio_error 鍑芥暟琚敤鏉ョ‘瀹氳姹傜殑鐘舵併傚叾鍘熷瀷濡備笅錛?/p>
int aio_error( struct aiocb *aiocbp );
                        

榪欎釜鍑芥暟鍙互榪斿洖浠ヤ笅鍐呭錛?/p>

  • EINPROGRESS錛岃鏄庤姹傚皻鏈畬鎴?
  • ECANCELLED錛岃鏄庤姹傝搴旂敤紼嬪簭鍙栨秷浜?
  • -1錛岃鏄庡彂鐢熶簡閿欒錛屽叿浣撻敊璇師鍥犲彲浠ユ煡闃?errno

aio_return

寮傛 I/O 鍜屾爣鍑嗗潡 I/O 涔嬮棿鐨勫彟澶栦竴涓尯鍒槸鎴戜滑涓嶈兘绔嬪嵆璁塊棶榪欎釜鍑芥暟鐨勮繑鍥炵姸鎬侊紝鍥犱負鎴戜滑騫舵病鏈夐樆濉炲湪 read 璋冪敤涓娿傚湪鏍囧噯鐨?read 璋冪敤涓紝榪斿洖鐘舵佹槸鍦ㄨ鍑芥暟榪斿洖鏃舵彁渚涚殑銆備絾鏄湪寮傛 I/O 涓紝鎴戜滑瑕佷嬌鐢?aio_return 鍑芥暟銆傝繖涓嚱鏁扮殑鍘熷瀷濡備笅錛?/p>
ssize_t aio_return( struct aiocb *aiocbp );
                        

鍙湁鍦?aio_error 璋冪敤紜畾璇鋒眰宸茬粡瀹屾垚錛堝彲鑳芥垚鍔燂紝涔熷彲鑳藉彂鐢熶簡閿欒錛変箣鍚庯紝鎵嶄細璋冪敤榪欎釜鍑芥暟銆?code>aio_return 鐨勮繑鍥炲煎氨絳変環浜庡悓姝ユ儏鍐典腑 read 鎴?write 緋葷粺璋冪敤鐨勮繑鍥炲鹼紙鎵浼犺緭鐨勫瓧鑺傛暟錛屽鏋滃彂鐢熼敊璇紝榪斿洖鍊煎氨涓?-1錛夈?/p>

aio_write

aio_write 鍑芥暟鐢ㄦ潵璇鋒眰涓涓紓姝ュ啓鎿嶄綔銆傚叾鍑芥暟鍘熷瀷濡備笅錛?

int aio_write( struct aiocb *aiocbp );
                        

aio_write 鍑芥暟浼氱珛鍗寵繑鍥烇紝璇存槑璇鋒眰宸茬粡榪涜鎺掗槦錛堟垚鍔熸椂榪斿洖鍊間負 0錛屽け璐ユ椂榪斿洖鍊間負 -1錛屽茍鐩稿簲鍦拌緗?errno錛夈?/p>

榪欎笌 read 緋葷粺璋冪敤綾諱技錛屼絾鏄湁涓鐐逛笉涓鏍風殑琛屼負闇瑕佹敞鎰忋傚洖鎯充竴涓嬪浜?read 璋冪敤鏉ヨ錛岃浣跨敤鐨勫亸縐婚噺鏄潪甯擱噸瑕佺殑銆傜劧鑰岋紝瀵逛簬 write 鏉ヨ錛岃繖涓亸縐婚噺鍙湁鍦ㄦ病鏈夎緗?O_APPEND 閫夐」鐨勬枃浠朵笂涓嬫枃涓墠浼氶潪甯擱噸瑕併傚鏋滆緗簡 O_APPEND錛岄偅涔堣繖涓亸縐婚噺灝變細琚拷鐣ワ紝鏁版嵁閮戒細琚檮鍔犲埌鏂囦歡鐨勬湯灝俱傚惁鍒欙紝aio_offset 鍩熷氨紜畾浜嗘暟鎹湪瑕佸啓鍏ョ殑鏂囦歡涓殑鍋忕Щ閲忋?/p>

aio_suspend

鎴戜滑鍙互浣跨敤 aio_suspend 鍑芥暟鏉ユ寕璧鳳紙鎴栭樆濉烇級璋冪敤榪涚▼錛岀洿鍒板紓姝ヨ姹傚畬鎴愪負姝紝姝ゆ椂浼氫駭鐢熶竴涓俊鍙鳳紝鎴栬呭彂鐢熷叾浠栬秴鏃舵搷浣溿傝皟鐢ㄨ呮彁渚涗簡涓涓?aiocb 寮曠敤鍒楄〃錛屽叾涓換浣曚竴涓畬鎴愰兘浼氬鑷?aio_suspend 榪斿洖銆?aio_suspend 鐨勫嚱鏁板師鍨嬪涓嬶細

int aio_suspend( const struct aiocb *const cblist[],
                        int n, const struct timespec *timeout );
                        

aio_suspend 鐨勪嬌鐢ㄩ潪甯哥畝鍗曘傛垜浠鎻愪緵涓涓?aiocb 寮曠敤鍒楄〃銆傚鏋滀換浣曚竴涓畬鎴愪簡錛岃繖涓皟鐢ㄥ氨浼氳繑鍥?0銆傚惁鍒欏氨浼氳繑鍥?-1錛岃鏄庡彂鐢熶簡閿欒銆傝鍙傜湅娓呭崟 3銆?/p>
娓呭崟 3. 浣跨敤 aio_suspend 鍑芥暟闃誨寮傛 I/O
                        struct aioct *cblist[MAX_LIST]
                        /* Clear the list. */
                        bzero( (char *)cblist, sizeof(cblist) );
                        /* Load one or more references into the list */
                        cblist[0] = &my_aiocb;
                        ret = aio_read( &my_aiocb );
                        ret = aio_suspend( cblist, MAX_LIST, NULL );
                        

娉ㄦ剰錛?code>aio_suspend 鐨勭浜屼釜鍙傛暟鏄?cblist 涓厓绱犵殑涓暟錛岃屼笉鏄?aiocb 寮曠敤鐨勪釜鏁般?code>cblist 涓換浣?NULL 鍏冪礌閮戒細琚?aio_suspend 蹇界暐銆?/p>

濡傛灉涓?aio_suspend 鎻愪緵浜嗚秴鏃訛紝鑰岃秴鏃舵儏鍐電殑紜彂鐢熶簡錛岄偅涔堝畠灝變細榪斿洖 -1錛?code>errno 涓細鍖呭惈 EAGAIN銆?/p>

aio_cancel

aio_cancel 鍑芥暟鍏佽鎴戜滑鍙栨秷瀵規煇涓枃浠舵弿榪扮鎵ц鐨勪竴涓垨鎵鏈?I/O 璇鋒眰銆傚叾鍘熷瀷濡備笅錛?/p>
int aio_cancel( int fd, struct aiocb *aiocbp );
                        

瑕佸彇娑堜竴涓姹傦紝鎴戜滑闇瑕佹彁渚涙枃浠舵弿榪扮鍜?aiocb 寮曠敤銆傚鏋滆繖涓姹傝鎴愬姛鍙栨秷浜嗭紝閭d箞榪欎釜鍑芥暟灝變細榪斿洖 AIO_CANCELED銆傚鏋滆姹傚畬鎴愪簡錛岃繖涓嚱鏁板氨浼氳繑鍥?AIO_NOTCANCELED銆?/p>

瑕佸彇娑堝鏌愪釜緇欏畾鏂囦歡鎻忚堪絎︾殑鎵鏈夎姹傦紝鎴戜滑闇瑕佹彁渚涜繖涓枃浠剁殑鎻忚堪絎︼紝浠ュ強涓涓 aiocbp 鐨?NULL 寮曠敤銆傚鏋滄墍鏈夌殑璇鋒眰閮藉彇娑堜簡錛岃繖涓嚱鏁板氨浼氳繑鍥?AIO_CANCELED錛涘鏋滆嚦灝戞湁涓涓姹傛病鏈夎鍙栨秷錛岄偅涔堣繖涓嚱鏁板氨浼氳繑鍥?AIO_NOT_CANCELED錛涘鏋滄病鏈変竴涓姹傚彲浠ヨ鍙栨秷錛岄偅涔堣繖涓嚱鏁板氨浼氳繑鍥?AIO_ALLDONE銆傛垜浠劧鍚庡彲浠ヤ嬌鐢?aio_error 鏉ラ獙璇佹瘡涓?AIO 璇鋒眰銆傚鏋滆繖涓姹傚凡緇忚鍙栨秷浜嗭紝閭d箞 aio_error 灝變細榪斿洖 -1錛屽茍涓?errno 浼氳璁劇疆涓?ECANCELED銆?/p>

lio_listio

鏈鍚庯紝AIO 鎻愪緵浜嗕竴縐嶆柟娉曚嬌鐢?lio_listio API 鍑芥暟鍚屾椂鍙戣搗澶氫釜浼犺緭銆傝繖涓嚱鏁伴潪甯擱噸瑕侊紝鍥犱負榪欐剰鍛崇潃鎴戜滑鍙互鍦ㄤ竴涓郴緇熻皟鐢紙涓嬈″唴鏍鎬笂涓嬫枃鍒囨崲錛変腑鍚姩澶ч噺鐨?I/O 鎿嶄綔銆備粠鎬ц兘鐨勮搴︽潵鐪嬶紝榪欓潪甯擱噸瑕侊紝鍥犳鍊煎緱鎴戜滑鑺辯偣鏃墮棿鎺㈢儲涓涓嬨?code>lio_listio API 鍑芥暟鐨勫師鍨嬪涓嬶細

int lio_listio( int mode, struct aiocb *list[], int nent,
                        struct sigevent *sig );
                        

mode 鍙傛暟鍙互鏄?LIO_WAIT 鎴?LIO_NOWAIT銆?code>LIO_WAIT 浼氶樆濉炶繖涓皟鐢紝鐩村埌鎵鏈夌殑 I/O 閮藉畬鎴愪負姝€傚湪鎿嶄綔榪涜鎺掗槦涔嬪悗錛?code>LIO_NOWAIT 灝變細榪斿洖銆?code>list 鏄竴涓?aiocb 寮曠敤鐨勫垪琛紝鏈澶у厓绱犵殑涓暟鏄敱 nent 瀹氫箟鐨勩傛敞鎰?list 鐨勫厓绱犲彲浠ヤ負 NULL錛?code>lio_listio 浼氬皢鍏跺拷鐣ャ?code>sigevent 寮曠敤瀹氫箟浜嗗湪鎵鏈?I/O 鎿嶄綔閮藉畬鎴愭椂浜х敓淇″彿鐨勬柟娉曘?/p>

瀵逛簬 lio_listio 鐨勮姹備笌浼犵粺鐨?read 鎴?write 璇鋒眰鍦ㄥ繀欏繪寚瀹氱殑鎿嶄綔鏂歸潰紼嶆湁涓嶅悓錛屽娓呭崟 4 鎵紺恒?/p>
娓呭崟 4. 浣跨敤 lio_listio 鍑芥暟鍙戣搗涓緋誨垪璇鋒眰
                        struct aiocb aiocb1, aiocb2;
                        struct aiocb *list[MAX_LIST];
                        ...
                        /* Prepare the first aiocb */
                        aiocb1.aio_fildes = fd;
                        aiocb1.aio_buf = malloc( BUFSIZE+1 );
                        aiocb1.aio_nbytes = BUFSIZE;
                        aiocb1.aio_offset = next_offset;
                        aiocb1.aio_lio_opcode = LIO_READ;
                        ...
                        bzero( (char *)list, sizeof(list) );
                        list[0] = &aiocb1;
                        list[1] = &aiocb2;
                        ret = lio_listio( LIO_WAIT, list, MAX_LIST, NULL );
                        

瀵逛簬璇繪搷浣滄潵璇達紝aio_lio_opcode 鍩熺殑鍊間負 LIO_READ銆傚浜庡啓鎿嶄綔鏉ヨ錛屾垜浠浣跨敤 LIO_WRITE錛屼笉榪?LIO_NOP 瀵逛簬涓嶆墽琛屾搷浣滄潵璇翠篃鏄湁鏁堢殑銆?/p>



鍥為〉棣?/font>


AIO 閫氱煡

鐜板湪鎴戜滑宸茬粡鐪嬭繃浜嗗彲鐢ㄧ殑 AIO 鍑芥暟錛屾湰鑺傚皢娣卞叆浠嬬粛瀵瑰紓姝ラ氱煡鍙互浣跨敤鐨勬柟娉曘傛垜浠皢閫氳繃淇″彿鍜屽嚱鏁板洖璋冩潵鎺㈢儲寮傛鍑芥暟鐨勯氱煡鏈哄埗銆?/p>

浣跨敤淇″彿榪涜寮傛閫氱煡

浣跨敤淇″彿榪涜榪涚▼闂撮氫俊錛圛PC錛夋槸 UNIX 涓殑涓縐嶄紶緇熸満鍒訛紝AIO 涔熷彲浠ユ敮鎸佽繖縐嶆満鍒躲傚湪榪欑鑼冧緥涓紝搴旂敤紼嬪簭闇瑕佸畾涔変俊鍙峰鐞嗙▼搴忥紝鍦ㄤ駭鐢熸寚瀹氱殑淇″彿鏃跺氨浼氳皟鐢ㄨ繖涓鐞嗙▼搴忋傚簲鐢ㄧ▼搴忕劧鍚庨厤緗竴涓紓姝ヨ姹傚皢鍦ㄨ姹傚畬鎴愭椂浜х敓涓涓俊鍙楓備綔涓轟俊鍙蜂笂涓嬫枃鐨勪竴閮ㄥ垎錛岀壒瀹氱殑 aiocb 璇鋒眰琚彁渚涚敤鏉ヨ褰曞涓彲鑳戒細鍑虹幇鐨勮姹傘傛竻鍗?5 灞曠ず浜嗚繖縐嶉氱煡鏂規硶銆?/p>
娓呭崟 5. 浣跨敤淇″彿浣滀負 AIO 璇鋒眰鐨勯氱煡
                        void setup_io( ... )
                        {
                        int fd;
                        struct sigaction sig_act;
                        struct aiocb my_aiocb;
                        ...
                        /* Set up the signal handler */
                        sigemptyset(&sig_act.sa_mask);
                        sig_act.sa_flags = SA_SIGINFO;
                        sig_act.sa_sigaction = aio_completion_handler;
                        /* Set up the AIO request */
                        bzero( (char *)&my_aiocb, sizeof(struct aiocb) );
                        my_aiocb.aio_fildes = fd;
                        my_aiocb.aio_buf = malloc(BUF_SIZE+1);
                        my_aiocb.aio_nbytes = BUF_SIZE;
                        my_aiocb.aio_offset = next_offset;
                        /* Link the AIO request with the Signal Handler */
                        my_aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
                        my_aiocb.aio_sigevent.sigev_signo = SIGIO;
                        my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb;
                        /* Map the Signal to the Signal Handler */
                        ret = sigaction( SIGIO, &sig_act, NULL );
                        ...
                        ret = aio_read( &my_aiocb );
                        }
                        void aio_completion_handler( int signo, siginfo_t *info, void *context )
                        {
                        struct aiocb *req;
                        /* Ensure it's our signal */
                        if (info->si_signo == SIGIO) {
                        req = (struct aiocb *)info->si_value.sival_ptr;
                        /* Did the request complete? */
                        if (aio_error( req ) == 0) {
                        /* Request completed successfully, get the return status */
                        ret = aio_return( req );
                        }
                        }
                        return;
                        }
                        

鍦ㄦ竻鍗?5 涓紝鎴戜滑鍦?aio_completion_handler 鍑芥暟涓緗俊鍙峰鐞嗙▼搴忔潵鎹曡幏 SIGIO 淇″彿銆傜劧鍚庡垵濮嬪寲 aio_sigevent 緇撴瀯浜х敓 SIGIO 淇″彿鏉ヨ繘琛岄氱煡錛堣繖鏄氳繃 sigev_notify 涓殑 SIGEV_SIGNAL 瀹氫箟鏉ユ寚瀹氱殑錛夈傚綋璇繪搷浣滃畬鎴愭椂錛屼俊鍙峰鐞嗙▼搴忓氨浠庤淇″彿鐨?si_value 緇撴瀯涓彁鍙栧嚭 aiocb錛屽茍媯鏌ラ敊璇姸鎬佸拰榪斿洖鐘舵佹潵紜畾 I/O 鎿嶄綔鏄惁瀹屾垚銆?/p>

瀵逛簬鎬ц兘鏉ヨ錛岃繖涓鐞嗙▼搴忎篃鏄氳繃璇鋒眰涓嬩竴嬈″紓姝ヤ紶杈撹岀戶緇繘琛?I/O 鎿嶄綔鐨勭悊鎯沖湴鏂廣傞噰鐢ㄨ繖縐嶆柟寮忥紝鍦ㄤ竴嬈℃暟鎹紶杈撳畬鎴愭椂錛屾垜浠氨鍙互绔嬪嵆寮濮嬩笅涓嬈℃暟鎹紶杈撴搷浣溿?/p>

浣跨敤鍥炶皟鍑芥暟榪涜寮傛閫氱煡

鍙﹀涓縐嶉氱煡鏂瑰紡鏄郴緇熷洖璋冨嚱鏁般傝繖縐嶆満鍒朵笉浼氫負閫氱煡鑰屼駭鐢熶竴涓俊鍙鳳紝鑰屾槸浼氳皟鐢ㄧ敤鎴風┖闂寸殑涓涓嚱鏁版潵瀹炵幇閫氱煡鍔熻兘銆傛垜浠湪 sigevent 緇撴瀯涓緗簡瀵?aiocb 鐨勫紩鐢紝浠庤屽彲浠ユ儫涓鏍囪瘑姝e湪瀹屾垚鐨勭壒瀹氳姹傘傝鍙傜湅娓呭崟 6銆?/p>
娓呭崟 6. 瀵?AIO 璇鋒眰浣跨敤綰跨▼鍥炶皟閫氱煡
                        void setup_io( ... )
                        {
                        int fd;
                        struct aiocb my_aiocb;
                        ...
                        /* Set up the AIO request */
                        bzero( (char *)&my_aiocb, sizeof(struct aiocb) );
                        my_aiocb.aio_fildes = fd;
                        my_aiocb.aio_buf = malloc(BUF_SIZE+1);
                        my_aiocb.aio_nbytes = BUF_SIZE;
                        my_aiocb.aio_offset = next_offset;
                        /* Link the AIO request with a thread callback */
                        my_aiocb.aio_sigevent.sigev_notify = SIGEV_THREAD;
                        my_aiocb.aio_sigevent.notify_function = aio_completion_handler;
                        my_aiocb.aio_sigevent.notify_attributes = NULL;
                        my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb;
                        ...
                        ret = aio_read( &my_aiocb );
                        }
                        void aio_completion_handler( sigval_t sigval )
                        {
                        struct aiocb *req;
                        req = (struct aiocb *)sigval.sival_ptr;
                        /* Did the request complete? */
                        if (aio_error( req ) == 0) {
                        /* Request completed successfully, get the return status */
                        ret = aio_return( req );
                        }
                        return;
                        }
                        

鍦ㄦ竻鍗?6 涓紝鍦ㄥ垱寤鴻嚜宸辯殑 aiocb 璇鋒眰涔嬪悗錛屾垜浠嬌鐢?SIGEV_THREAD 璇鋒眰浜嗕竴涓嚎紼嬪洖璋冨嚱鏁版潵浣滀負閫氱煡鏂規硶銆傜劧鍚庢垜浠皢鎸囧畾鐗瑰畾鐨勯氱煡澶勭悊紼嬪簭錛屽茍灝嗚浼犺緭鐨勪笂涓嬫枃鍔犺澆鍒板鐞嗙▼搴忎腑錛堝湪榪欑鎯呭喌涓紝鏄釜瀵?aiocb 璇鋒眰鑷繁鐨勫紩鐢級銆傚湪榪欎釜澶勭悊紼嬪簭涓紝鎴戜滑綆鍗曞湴寮曠敤鍒拌揪鐨?sigval 鎸囬拡騫朵嬌鐢?AIO 鍑芥暟鏉ラ獙璇佽姹傚凡緇忓畬鎴愩?/p>



鍥為〉棣?/font>


瀵?AIO 榪涜緋葷粺浼樺寲

proc 鏂囦歡緋葷粺鍖呭惈浜嗕袱涓櫄鎷熸枃浠訛紝瀹冧滑鍙互鐢ㄦ潵瀵瑰紓姝?I/O 鐨勬ц兘榪涜浼樺寲錛?/p>

  • /proc/sys/fs/aio-nr 鏂囦歡鎻愪緵浜嗙郴緇熻寖鍥村紓姝?I/O 璇鋒眰鐜板湪鐨勬暟鐩?
  • /proc/sys/fs/aio-max-nr 鏂囦歡鏄墍鍏佽鐨勫茍鍙戣姹傜殑鏈澶т釜鏁般傛渶澶т釜鏁伴氬父鏄?64KB錛岃繖瀵逛簬澶ч儴鍒嗗簲鐢ㄧ▼搴忔潵璇撮兘宸茬粡瓚沖浜嗐?




鍥為〉棣?/font>


緇撴潫璇?

浣跨敤寮傛 I/O 鍙互甯姪鎴戜滑鏋勫緩 I/O 閫熷害鏇村揩銆佹晥鐜囨洿楂樼殑搴旂敤紼嬪簭銆傚鏋滄垜浠殑搴旂敤紼嬪簭鍙互瀵瑰鐞嗗拰 I/O 鎿嶄綔閲嶅彔榪涜錛岄偅涔?AIO 灝卞彲浠ュ府鍔╂垜浠瀯寤哄彲浠ユ洿楂樻晥鍦頒嬌鐢ㄥ彲鐢?CPU 璧勬簮鐨勫簲鐢ㄧ▼搴忋傚敖綆¤繖縐?I/O 妯″瀷涓庡湪澶ч儴鍒?Linux 搴旂敤紼嬪簭涓嬌鐢ㄧ殑浼犵粺闃誨妯″紡閮戒笉鍚岋紝浣嗘槸寮傛閫氱煡妯″瀷鍦ㄦ蹇典笂鏉ヨ鍗撮潪甯哥畝鍗曪紝鍙互綆鍖栨垜浠殑璁捐銆?



鍙傝冭祫鏂?

瀛︿範
  • 鎮ㄥ彲浠ュ弬闃呮湰鏂囧湪 developerWorks 鍏ㄧ悆绔欑偣涓婄殑 鑻辨枃鍘熸枃 銆?br>
  • POSIX.1b 瀹炵幇 浠?GNU Library 鐨勮搴︿粙緇嶄簡 AIO 鐨勮緇嗗唴騫曘?

  • Realtime Support in Linux 瑙i噴浜嗘洿澶氭湁鍏?AIO 鍜屽緢澶氬疄鏃舵墿灞曠殑淇℃伅錛屽唴瀹逛粠璋冨害銆丳OSIX I/O 鍒?POSIX 綰跨▼鍜岄珮鍒嗚鯨鐜囩殑瀹氭椂鍣紙HRT錛夈?

  • 鍦ㄤ負 2.5 鐗堟湰鍐呮牳闆嗘垚鑰岀紪鍐欑殑 Design Notes 涓紝鎴戜滑鍙互瀛︿範鏈夊叧 Linux 涓?AIO 鐨勮璁″拰瀹炵幇鐨勭煡璇嗐?

  • 鍦?developerWorks Linux 涓撳尯 涓彲浠ユ壘鍒頒負 Linux 寮鍙戜漢鍛樺噯澶囩殑鏇村璧勬簮銆?

  • 闅忔椂鍏蟲敞 developerWorks 鎶鏈簨浠跺拰緗戠粶騫挎挱銆?

鑾峰緱浜у搧鍜屾妧鏈?/strong>
  • 璁㈣喘鍏嶈垂鐨?SEK for Linux錛岃繖鏈変袱寮?DVD錛屽寘鎷渶鏂扮殑 IBM for Linux 鐨勮瘯鐢ㄨ蔣浠訛紝鍖呮嫭 DB2®銆丩otus®銆丷ational®銆乀ivoli® 鍜?WebSphere®銆?

  • 鍦ㄦ偍鐨勪笅涓涓紑鍙戦」鐩腑閲囩敤 IBM 璇曠敤杞歡錛岃繖鍙互浠?developerWorks 涓婄洿鎺ヤ笅杞姐?


璁ㄨ


鍏充簬浣滆?/span>

M. Tim Jones

Tim Jones 鏄竴鍚嶅祵鍏ュ紡杞歡宸ョ▼甯堬紝浠栨槸 GNU/Linux Application Programming銆?em>AI Application Programming 浠ュ強 BSD Sockets Programming from a Multilanguage Perspective 絳変功鐨勪綔鑰呫備粬鐨勫伐紼嬭儗鏅潪甯稿箍娉涳紝浠庡悓姝ュ畤瀹欓鑸圭殑鍐呮牳寮鍙戝埌宓屽叆寮忔灦鏋勮璁★紝鍐嶅埌緗戠粶鍗?/p>



Bugs 2008-06-19 17:53 鍙戣〃璇勮
]]>
鍒濇浣跨敤linux涓嬬殑寮傛I/Ohttp://www.shnenglu.com/Bugs/archive/2008/06/19/54037.htmlBugsBugsThu, 19 Jun 2008 09:50:00 GMThttp://www.shnenglu.com/Bugs/archive/2008/06/19/54037.htmlhttp://www.shnenglu.com/Bugs/comments/54037.htmlhttp://www.shnenglu.com/Bugs/archive/2008/06/19/54037.html#Feedback0http://www.shnenglu.com/Bugs/comments/commentRss/54037.htmlhttp://www.shnenglu.com/Bugs/services/trackbacks/54037.html 

 1#include <stdio.h>
 2#include <stdlib.h>
 3#include <aio.h>
 4#include <errno.h>
 5
 6
 7int main(int argc, char *argv[])
 8{
 9
10  int fd, ret;
11  struct aiocb my_aiocb;
12
13  fd = open( "file.txt", O_RDONLY );
14  if (fd < 0) perror("open");
15
16  /* Zero out the aiocb structure (recommended) */
17  bzero( (char *)&my_aiocb, sizeof(struct aiocb) );
18
19  /* Allocate a data buffer for the aiocb request */
20  my_aiocb.aio_buf = malloc(BUFSIZE+1);
21  if (!my_aiocb.aio_buf) perror("malloc");
22
23  /* Initialize the necessary fields in the aiocb */
24  my_aiocb.aio_fildes = fd;
25  my_aiocb.aio_nbytes = BUFSIZE;
26  my_aiocb.aio_offset = 0;
27
28  ret = aio_read( &my_aiocb );
29  if (ret < 0) perror("aio_read");
30
31  while ( aio_error( &my_aiocb ) == EINPROGRESS ) ;
32
33  if ((ret = aio_return( &my_iocb )) > 0{
34      printf("%s\n", my_aiocb.aio_buf);
35    /* got ret bytes on the read */
36  }
 else {
37    /* read failed, consult errno */
38  }

39
40
41}


g++ test.cpp -lrt



Bugs 2008-06-19 17:50 鍙戣〃璇勮
]]>
RamDisk濂藉錛?/title><link>http://www.shnenglu.com/Bugs/archive/2008/06/16/53517.html</link><dc:creator>Bugs</dc:creator><author>Bugs</author><pubDate>Mon, 16 Jun 2008 03:37:00 GMT</pubDate><guid>http://www.shnenglu.com/Bugs/archive/2008/06/16/53517.html</guid><wfw:comment>http://www.shnenglu.com/Bugs/comments/53517.html</wfw:comment><comments>http://www.shnenglu.com/Bugs/archive/2008/06/16/53517.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/Bugs/comments/commentRss/53517.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Bugs/services/trackbacks/53517.html</trackback:ping><description><![CDATA[<p>濡傛灉浣犳湁瓚沖澶х殑鍐呭瓨錛?G錛夛紝浣犲彲浠ラ噰鐢≧amDisk榪欎釜鎶鏈?br><br>浣曡皳RamDisk錛屽氨鏄唴瀛樻槧灝勬垚紜洏錛?br>鏈変粈涔堝ソ澶勫憿錛?br>璁塊棶閫熷害蹇?br>      鍙敤浜庨鍙戝瓨鍙栵紝澶у悶鍚愰噺紓佺洏鎿嶄綔<br>鎺夌數鍚庡嵆娑堝け</p>        涓存椂鏂囦歡<br><br><br>linux涓嬬殑/tmp灝辨槸ramdisk<br><br>windows涓嬮渶瑕佸畨瑁呰蔣浠訛紝鎺ㄨ崘涓涓紙gavotte ramdisk錛?br> <img src ="http://www.shnenglu.com/Bugs/aggbug/53517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Bugs/" target="_blank">Bugs</a> 2008-06-16 11:37 <a href="http://www.shnenglu.com/Bugs/archive/2008/06/16/53517.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>閰嶇疆鏂囦歡綾伙紒http://www.shnenglu.com/Bugs/archive/2008/05/26/51146.htmlBugsBugsMon, 26 May 2008 07:25:00 GMThttp://www.shnenglu.com/Bugs/archive/2008/05/26/51146.htmlhttp://www.shnenglu.com/Bugs/comments/51146.htmlhttp://www.shnenglu.com/Bugs/archive/2008/05/26/51146.html#Feedback4http://www.shnenglu.com/Bugs/comments/commentRss/51146.htmlhttp://www.shnenglu.com/Bugs/services/trackbacks/51146.html////////////////////////////
// file : test.conf
a = 1;

b = 1
2
3
;

c = hi you;

d = "hi you" boy 110;

e = "\\=\\ \"test\"";        //  \=\"test"

/* end */
////////////////////////////


鍏朵腑錛?br>// 鍜?nbsp;/* */鏄敞閲婏紱
 \\ 杞箟涓篭 錛?\*杞箟涓?錛?br>姣忎釜鍊肩┖鏍煎垎闅旓紝濡傛灉浣跨敤浜嗗紩鍙?錛屽垯" "涔嬮棿鐨勫氨涓哄鹼紱
杞箟絎︼紝蹇呴』鐢ㄥ湪""褰㈠紡鐨勫間腑錛?br>鍒嗗彿;涓虹粨鏉熺鍙楓?br>
杞藉叆閰嶇疆鏂囦歡錛?br>
1bool Open(const char *filename);


鑾峰彇鎸囧畾key鐨剉alue錛?br>
1const char *GetValue(const char *key, int idx=0);


涓嬮潰鏄竴涓嬌鐢╠emo錛?br>
 1#include "../src/Common/Settings.h"
 2
 3int main(int argc, char *argv[])
 4{
 5
 6    Settings s;
 7    if( s.Open("test.conf") )
 8    {
 9        LOGI("load file succed!");
10
11        LOGE("%s",  s.GetValue("c"3) );
12    }

13    else
14    {
15        LOGE("load file failed!");
16    }

17    return 0;
18}

19

//
浠g爜錛?a >http://code.google.com/p/bugs1111 閲岄潰鏌ユ壘settgings.h settgings.cpp

Bugs 2008-05-26 15:25 鍙戣〃璇勮
]]>
緗戠粶緙栫▼ 蹇冨緱2http://www.shnenglu.com/Bugs/archive/2008/04/24/48047.htmlBugsBugsThu, 24 Apr 2008 10:33:00 GMThttp://www.shnenglu.com/Bugs/archive/2008/04/24/48047.htmlhttp://www.shnenglu.com/Bugs/comments/48047.htmlhttp://www.shnenglu.com/Bugs/archive/2008/04/24/48047.html#Feedback7http://www.shnenglu.com/Bugs/comments/commentRss/48047.htmlhttp://www.shnenglu.com/Bugs/services/trackbacks/48047.html閭d箞鍦ㄥ叧闂殑鏃跺欙紝浼氱粡鍘員IME_WAIT鐨勮繃紼嬶紝涓鑸瑆indows涓嬫槸2鍒嗛挓錛岃繖孌墊椂闂達紝瀹㈡埛绔痗onnect鐨勬椂鍊欙紝浼氬嚭閿?WSAEADDRINUSE:10048)錛?br>鎬庝箞涓嶇粡鍘嗚繖涓姸鎬佸憿錛?br>浣跨敤涓嬮潰浠g爜錛?br>
  // 濡傛灉瑕佸凡緇忓浜庤繛鎺ョ姸鎬佺殑soket鍦ㄨ皟鐢╟losesocket鍚庡己鍒跺叧闂紝涓嶇粡鍘員IME_WAIT鐨勮繃紼嬶細
  BOOL bDontLinger = FALSE;
  if (setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL))< 0) {
   wsaperror("setsockopt");
   break;
  }


Bugs 2008-04-24 18:33 鍙戣〃璇勮
]]>
緗戠粶緙栫▼ 蹇冨緱1http://www.shnenglu.com/Bugs/archive/2008/04/08/46509.htmlBugsBugsTue, 08 Apr 2008 06:43:00 GMThttp://www.shnenglu.com/Bugs/archive/2008/04/08/46509.htmlhttp://www.shnenglu.com/Bugs/comments/46509.htmlhttp://www.shnenglu.com/Bugs/archive/2008/04/08/46509.html#Feedback2http://www.shnenglu.com/Bugs/comments/commentRss/46509.htmlhttp://www.shnenglu.com/Bugs/services/trackbacks/46509.html

浠ュ墠欏圭洰閲屽彂鐜頒竴涓繖鏍風殑闂錛屽綋緗戠粶鏈嶅姟榪涚▼鍏蟲帀鐨勬椂鍊欙紝鍦ㄧ珛鍗沖惎鍔ㄨ鏈嶅姟錛屼細鏈夐敊璇彁紺鴻port琚崰鐢ㄤ簡錛岀洃鍚け璐ャ?br>
鏈榪戝湪鐪嬨妘nix 緗戠粶緙栫▼銆嬶紝鍦ㄩ噷闈簡瑙e埌浜?閾炬帴鏃剁殑涓夋鎻℃墜 鍜?鍏抽棴鏃剁殑鍥涙鎻℃墜錛?br>鍦ㄥ叧闂椂鏈鍚庝細鏈変竴涓猅IME_WAIT鐘舵侊紝榪欎釜鐘舵佹椂闂存槸TCP閲屾渶闀跨殑錛屾槸浜屽峂SL鏃墮棿錛屽ぇ綰﹀湪1-4鍒嗛挓銆?br>鑷充簬涓轟粈涔堣淇濈暀榪欎釜鐘舵佸拰榪欎箞闀跨殑鏃墮棿錛岃鍙傝冦妘nix 緗戠粶緙栫▼銆嬬浜岀珷 2.7.

浣嗚繖鏍風殑闂鏄彲浠ヨВ鍐崇殑錛屼嬌鐢?span>SO_REUSEADDR    enables local address reuse錛屽彲浠ュ湪TIME_WAIT鐘舵佷笅浣跨敤鐩稿悓鐨凱ORT銆?/span>

int reuser_addr = 1;
 ::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const void*)&reuse_addr, sizeof(reuse_addr));

SO_REUSEADDR 鐨勭敤閫旈櫎浜嗕笂闈㈣繖縐嶆儏鍐碉紝榪樻湁涓夌鍒嗗埆鏄細
*)鍦ㄥ緗戝崱鐨勬椂鍊欙紝澶氳繘紼嬪彲浠ヤ嬌鐢ㄤ笉鍚孖P錛岀浉鍚孭ORT銆?br>*)涓庝笂鏉″樊涓嶅錛屽湪鍗曡繘紼嬩嬌鐢ㄤ嬌鐢ㄤ笉鍚孖P錛岀浉鍚孭ORT銆?br>*)鍦║DP騫挎挱鐨勬椂鍊欙紝鍙互鍦ㄧ浉鍚孖P鍜孭ORT涓嬩嬌鐢紝TCP鍒欎笉琛屻?/span>


Bugs 2008-04-08 14:43 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国内外成人免费激情在线视频| 亚洲自拍电影| 黑人巨大精品欧美黑白配亚洲| 一区二区精品在线观看| 一区二区三区久久精品| 欧美亚洲成人网| 欧美一级二区| 久久精品五月| 日韩午夜中文字幕| 中日韩视频在线观看| 国模一区二区三区| 亚洲成人在线免费| 中文精品视频一区二区在线观看| 国产精品黄色在线观看| 久久久在线视频| 欧美精品1区2区| 性欧美办公室18xxxxhd| 久久亚洲免费| 亚洲午夜精品一区二区| 久久精品99久久香蕉国产色戒| 亚洲精品九九| 欧美一区二区三区视频在线观看 | 久久久www| 宅男噜噜噜66一区二区66| 性久久久久久久久| 日韩一级片网址| 久久超碰97中文字幕| 9l国产精品久久久久麻豆| 久久www成人_看片免费不卡| 亚洲精品一二| 久久精品国产亚洲精品| 亚洲欧美电影院| 麻豆国产精品777777在线 | 国产精品伦一区| 亚洲国产日韩欧美一区二区三区| 国产视频久久网| 亚洲精品永久免费| 亚洲国产精品成人综合色在线婷婷 | 久久久久国产精品厨房| 欧美精品激情blacked18| 久久久久久久久一区二区| 欧美性猛交视频| 欧美高清视频| 激情综合自拍| 性一交一乱一区二区洋洋av| 亚洲欧美日韩中文播放| 欧美日本不卡高清| 欧美成在线视频| 激情欧美日韩| 久久本道综合色狠狠五月| 久久国产日本精品| 国产欧美日韩综合精品二区| 99re6热在线精品视频播放速度| 亚洲激情视频网站| 久久综合九色综合欧美就去吻| 久久精品一区二区三区不卡| 国产精品视频第一区| 亚洲一区二区三区久久| 久久综合一区二区| 亚洲日韩视频| 欧美大片91| 欧美肥婆在线| 亚洲人永久免费| 欧美成人午夜激情在线| 欧美激情视频免费观看| 亚洲欧洲日本国产| 免费欧美在线| 亚洲靠逼com| 亚洲视频香蕉人妖| 国产精品亚发布| 欧美一区二区三区日韩视频| 久久欧美肥婆一二区| 曰本成人黄色| 欧美激情亚洲精品| 在线视频亚洲一区| 欧美一区精品| 国产一级久久| 欧美3dxxxxhd| 宅男在线国产精品| 久久手机精品视频| 亚洲美女免费视频| 国产精品国产三级国产专区53 | 久久午夜影视| 亚洲三级影院| 欧美手机在线视频| 午夜精品福利一区二区三区av| 久久夜色精品国产亚洲aⅴ| 在线观看成人av| 欧美日韩亚洲系列| 性色av一区二区三区在线观看 | 91久久精品美女高潮| 欧美日产一区二区三区在线观看| 一区二区三区你懂的| 久久精品在线免费观看| 亚洲美女在线国产| 国产亚洲aⅴaaaaaa毛片| 老司机aⅴ在线精品导航| 一本久久综合| 鲁大师影院一区二区三区| 99精品视频一区二区三区| 国产欧美一区二区三区在线老狼| 久久免费黄色| 亚洲欧美在线aaa| 亚洲欧洲在线观看| 久久夜色精品| 亚洲综合电影| 亚洲美女视频在线免费观看| 国产日韩欧美不卡在线| 欧美日韩三级视频| 久久亚洲综合| 欧美一区二区三区在线播放| 99精品免费| 欧美成年人在线观看| 性色一区二区三区| 日韩视频第一页| 亚洲高清视频在线| 国产日韩亚洲欧美| 欧美性猛交一区二区三区精品| 麻豆视频一区二区| 久久大综合网| 亚洲一区二区在线| 一区二区三区久久久| 亚洲欧洲一二三| 亚洲第一区中文99精品| 牛夜精品久久久久久久99黑人 | 亚洲一区二区三区精品在线| 亚洲福利国产精品| 黄网站免费久久| 国产欧美一区二区三区视频| 国产精品海角社区在线观看| 欧美区国产区| 欧美精品啪啪| 欧美成人免费播放| 快播亚洲色图| 老**午夜毛片一区二区三区| 久久久久高清| 久久男人资源视频| 久久国产精品黑丝| 久久精品av麻豆的观看方式| 久久国产手机看片| 久久深夜福利| 另类天堂av| 欧美成人影音| 欧美国产日韩一二三区| 欧美精品一区二区视频| 欧美激情综合亚洲一二区| 欧美国产精品va在线观看| 欧美激情精品久久久六区热门| 美日韩精品视频| 欧美国产日本在线| 欧美日韩少妇| 国产农村妇女精品| 国产性色一区二区| 在线观看精品一区| 91久久久久| 亚洲一区在线看| 午夜视频在线观看一区| 久久夜色撩人精品| 亚洲国产视频一区| 在线一区二区三区做爰视频网站 | 美女视频黄免费的久久| 欧美激情一区二区三级高清视频| 亚洲国产精品久久久久婷婷884| 亚洲精品一区二区三区蜜桃久| 99精品国产一区二区青青牛奶| 亚洲欧美日韩国产成人| 久久精品系列| 欧美日韩亚洲一区二区三区四区| 国产精品国产自产拍高清av王其| 国产综合色精品一区二区三区| 亚洲国产小视频| 一本一本久久| 久久琪琪电影院| 亚洲三级国产| 久久精品二区亚洲w码| 欧美区视频在线观看| 国产一区二区三区久久 | 亚洲国产高清一区二区三区| 亚洲私拍自拍| 欧美凹凸一区二区三区视频| 99在线精品免费视频九九视| 欧美一区在线看| 欧美日韩精品免费观看视一区二区| 国产色产综合产在线视频| 亚洲欧洲日产国产网站| 欧美一区国产二区| 亚洲免费观看高清完整版在线观看熊 | 久热精品视频| 欧美午夜在线视频| 91久久一区二区| 欧美主播一区二区三区| 亚洲人精品午夜| 久久狠狠婷婷| 亚洲欧洲日本在线| 久久久久久久97| 国产精品日韩精品欧美精品| 日韩午夜电影在线观看| 久久在线播放| 欧美一级片一区| 国产精品入口尤物|