锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍦ㄩ氬父鎯呭喌涓嬶紝鍏變韓搴撻兘鏄氳繃浣跨敤闄勫姞閫夐」 -fpic 鎴?nbsp;-fPIC 榪涜緙栬瘧錛屼粠鐩爣浠g爜浜х敓浣嶇疆鏃犲叧鐨勪唬鐮侊紙Position Independent Code錛孭IC錛夛紝浣跨敤 -shared閫夐」灝嗙洰鏍囦唬鐮佹斁榪涘叡浜洰鏍囧簱涓備綅緗棤鍏充唬鐮侀渶瑕佽兘澶熻鍔犺澆鍒頒笉鍚岃繘紼嬬殑涓嶅悓鍦板潃錛屽茍涓旇兘寰椾互姝g‘鐨勬墽琛岋紝鏁呭叾浠g爜瑕佺粡榪囩壒鍒殑緙栬瘧澶勭悊錛氫綅緗棤鍏充唬鐮侊紙PIC錛夊甯擱噺鍜屽嚱鏁板叆鍙e湴鍧鐨勬搷浣滈兘鏄噰鐢ㄥ熀浜庡熀瀵勫瓨鍣紙base register錛塀ASE+ 鍋忕Щ閲忕殑鐩稿鍦板潃鐨勫鍧鏂瑰紡銆傚嵆浣跨▼搴忚瑁呰澆鍒板唴瀛樹腑鐨勪笉鍚屽湴鍧錛屽嵆 BASE 鍊間笉鍚岋紝鑰屽亸縐婚噺鏄笉鍙樼殑錛屾墍浠ョ▼搴忎粛鐒跺彲浠ユ壘鍒版紜殑鍏ュ彛鍦板潃鎴栬呭父閲忋?/p> 鐒惰岋紝褰撳簲鐢ㄧ▼搴忛摼鎺ヤ簡澶氫釜鍏變韓搴擄紝濡傛灉鍦ㄨ繖浜涘叡浜簱涓紝瀛樺湪鐩稿悓浣滅敤鍩熻寖鍥寸殑鍚屽悕闈欐佹垚鍛樺彉閲忔垨鑰呭悓鍚?( 闈為潤鎬?) 鍏ㄥ眬鍙橀噺錛岄偅涔堝綋紼嬪簭璁塊棶瀹岄潤鎬佹垚鍛樺彉閲忔垨鍏ㄥ眬鍙橀噺緇撴潫鏋愭瀯鏃訛紝鐢變簬鏌愬唴瀛樺潡鐨?double free 浼氬鑷?core dump錛岃繖鏄敱浜?Linux 緙栬瘧鍣ㄧ殑緙洪櫡閫犳垚鐨勩?/p> 璇ラ棶棰樻簮浜庣瑪鑰呮墍浠庝簨鐨勫紑鍙戦」鐩細IBM Tivoli Workload Scheduler (TWS) LoadLeveler銆?strong>LoadLeveler鏄?nbsp;IBM鍦ㄩ珮鎬ц兘璁$畻錛?strong>High Performance Computing錛孒PC錛夐鍩熺殑涓嬈句綔涓氳皟搴﹁蔣浠躲傚畠涓昏鍒嗕負涓や釜澶х殑妯″潡錛屽垎鍒槸璋冨害妯″潡錛坰cheduler錛夊拰璧勬簮綆$悊妯″潡錛坮esource manger錛夈?涓や釜妯″潡涓垎鍒惈鏈夊叧浜庨厤緗鐞嗗姛鑳界殑鍏變韓搴擄紝鐢變簬鏌愪簺閰嶇疆綆$悊閫夐」涓轟袱妯″潡鎵鍏卞悓閲囩敤錛屾墍浠ヤ袱妯″潡涔嬮棿鍏變韓浜嗛儴鍒嗘簮鏂囦歡浠g爜錛屽叾涓寘鍚湁鍚屽悕鐨勭被闈欐佹垚鍛樸?/p> 鍙互閫氳繃浠ヤ笅綆鍗曠殑妯″瀷榪涜鎻忚堪錛?/p> 瀵瑰簲鐨勫悇妯″潡浠g爜鐗囨濡備笅鍥炬墍紺猴細 鍏朵腑錛宼est.c 鏄富紼嬪簭錛屽寘鍚湁涓や釜澶存枃浠訛細api1.h 涓?api2.h錛涘ご鏂囦歡 api1.h 鍖呭惈澶存枃浠?lib1/lib.h 鍜屼竴鍔熻兘鍑芥暟 func_api1()錛宎pi2.h 鍖呭惈澶存枃浠?lib2/lib.h 鍜屼竴鍔熻兘鍑芥暟 func_api2()錛涚洰褰?lib1 鍜?lib2 涓嬬殑婧愭枃浠跺垎鍒紪璇戠敓鎴愬叡浜簱 lib1.so 鍜?lib2.so銆傚悓鏃訛紝澶存枃浠?lib1/lib.h 涓?lib2/lib.h 閾炬帴鍒板悓涓鍏變韓鏂囦歡 lib.h銆傚湪鏂囦歡 lib.h 涓畾涔夋湁涓闈欐佹垚鍛樺彉閲?#8220;static std::vector<int> vec_int”銆?/p> 鍔熻兘鍑芥暟涓庡悇闈欐佹垚鍛樺嚱鏁頒唬鐮佹竻鍗?/span> 鍔熻兘鍑芥暟 func_api1() 涓?func_api2() 鐨勫疄鐜扮被浼鹼紝閫氳繃璋冪敤闈欐佹垚鍛樺嚱鏁拌揪鍒拌闂潤鎬佹垚鍛樺彉閲?nbsp;vec_int鐨勭洰鐨勶細 闈欐佹垚鍛樺嚱鏁?A::set() 涓?A::print() 鐨勫疄鐜板涓嬶細 A::set() 瀵歸潤鎬佹垚鍛?nbsp;vec_int榪涜璧嬪兼搷浣滐紝鑰?A::print() 鍒欐墦鍗板叾涓殑鍊間笌褰撳墠欏圭殑鍐呭瓨鍦板潃銆?/p> 濡傛灉涓や釜鍏變韓搴撴槸閫氳繃閫夐」 -fpic鎴?nbsp;-fPIC緙栬瘧鐨勮瘽錛岃繍琛岀▼搴?test錛岃緭鍑哄涓嬶細 浠庣▼搴忕殑杈撳嚭鐩磋鐨勭湅鍒幫紝core 浜х敓鏄敱浜庡爢鍐呭瓨鍖哄煙錛?strong>09cbf000-09ce0000錛変腑璧峰鍦板潃涓?nbsp;0x09cbf028鐨勫唴瀛樺尯琚噴鏀句簡涓ゆ瀵艱嚧鐨勶紝璇ュ湴鍧姝e紡闈欐佹垚鍛樺彉閲?nbsp;vec_int鐨勭涓涓厓绱犵殑鍦板潃銆?/p> 涓轟粈涔堜細鍑虹幇鍚屼竴鍧楀唴瀛樺尯錛岃閲婃斁涓ゆ鐨勬儏褰㈠憿錛?/p> 鎴戜滑鐭ラ亾錛岄潤鎬佹垚鍛樺彉閲忎笌鍏ㄥ眬鍙橀噺綾諱技錛岄兘閲囩敤浜嗛潤鎬佸瓨鍌ㄦ柟寮忋傚浜庡姞浜嗛夐」 -fpic鎴?nbsp;-fPIC鐨勫叡浜簱錛岃繖浜涘彉閲忕殑鍦板潃閮藉瓨鏀懼湪璇ュ叡浜簱鐨勫叏灞鍋忕Щ琛紙Global Offset Table錛孏OT錛変腑銆?/p> 閫氳繃 objdump鎴栬?nbsp;readelf鍛戒護鍒嗘瀽鍏變韓搴?nbsp;lib1.so錛岀粨鏋滃涓嬶細 浠庝笂闈袱涓懡浠ょ殑杈撳嚭緇撴灉涓彲浠ョ湅鍑猴紝鍏變韓搴?nbsp;lib1.so涓?nbsp;GOT孌電殑璧峰鍐呭瓨鍦板潃涓?nbsp;000030f4錛屽ぇ灝忎負 20 瀛楄妭 (0x14)錛涢潤鎬佹垚鍛樺彉閲?nbsp;vec_int鍦ㄥ叡浜簱 lib1.so涓殑璧峰鍋忕Щ鍦板潃涓?nbsp;000030fc銆傛樉鐒訛紝vec_int浣嶄簬璇ュ叡浜簱鐨?nbsp;GOT孌靛唴銆?/p> 褰撳簲鐢ㄧ▼搴忓悓鏃墮摼鎺?nbsp;lib1.so鍜?nbsp;lib2.so鏃訛紝鍚屽悕闈欐佹垚鍛樺彉閲?nbsp;vec_int鍒嗗埆浣嶄簬鍏跺叡浜簱鐨?nbsp;GOT鍖恒傚綋紼嬪簭榪愯鏃訛紝緋葷粺浠庣鍙瘋〃涓煡鎵懼茍瑁呰澆鏋勯犱竴浠?nbsp;vec_int鏁版嵁錛岃繖鐐逛粠紼嬪簭榪愯鐨勮緭鍑虹粨鏋滐紙娓呭崟 4錛夌殑“Backtrace”閮ㄥ垎鍙互鐪嬪埌錛氬彧鏈?nbsp;lib1.so涓殑闈欐佹垚鍛樺彉閲忚瑁呰澆鏋勯狅紱鍚屾椂錛岄氳繃鍐呭瓨鏄犲皠錛?strong>Memory map錛夐儴鍒嗭紙娓呭崟 4錛夛紝鍙互瑙傚療鍒?nbsp;vec_int瀵硅薄鐨勫湴鍧 0xe89228姝eソ澶勫湪涓哄叡浜簱 lib1.so鍒嗛厤鐨勫彲璇誨唴瀛樺尯 00e89000-00e8a000涓細 鐒跺悗錛屽綋紼嬪簭緇撴潫鏃訛紝鍗村璇ュ彉閲忚繘琛屼簡涓ゆ鏋愭瀯鎿嶄綔錛岄氳繃 gdb鍒嗘瀽 core 鏂囦歡錛?/p> 浠庢竻鍗?7 涓彲浠ョ湅鍑猴紝浠庡撫 #14 寮濮嬶紝紼嬪簭榪涜 lib2.so涓殑鏋愭瀯鎿嶄綔錛岀洿鍒?#11錛岄兘榪愯鍦?nbsp;lib2.so涓紝褰撹繘鍏ュ撫 #10 鏃訛紝榪涜鍙橀噺鏋愭瀯鏃訛紝鍏跺湴鍧涓?nbsp;0x00e8850c錛岃鍦板潃涓殑瀵硅薄鏄▼搴忓惎鍔ㄦ椂鐢卞叡浜簱 lib1.so瑁呰澆鏋勯犲嚭鏉ョ殑錛堟竻鍗?1錛夛細 褰撶▼搴忕粨鏉熸椂錛岃繍琛屽簱 glibc媯嫻嬪埌鍏變韓搴?nbsp;lib2.so鏋愭瀯浜嗗茍闈炵敱鍏舵瀯閫犵殑瀵硅薄錛屽鑷翠簡 core dump銆?/p> 榪欑鎯呭喌涓嬶紝濡傛灉鏇挎崲浣跨敤閫夐」 -fpie鎴?nbsp;-fPIE錛屾搷浣滄楠や笌榪愯緇撴灉濡備笅鎵紺猴細 紼嬪簭榪愯緇撴灉絎﹀悎鏈熸湜騫舵甯哥粨鏉熴?/p> 榪欐槸鍥犱負錛屽綋浣跨敤閫夐」 -fpie鎴?nbsp;-fPIE鏃訛紝鐢熸垚鐨勫叡浜簱涓嶄細涓洪潤鎬佹垚鍛樺彉閲忔垨鍏ㄥ眬鍙橀噺鍦?nbsp;GOT涓垱寤哄搴旂殑鏉$洰錛堥氳繃 objdump鎴?strong>readelf鍛戒護鍙互鏌ョ湅錛屾澶勪笉鍐嶈禈榪幫級錛屼粠鑰岄伩鍏嶄簡鐢變簬闈欐佸璞?#8220;鏋勯犱竴嬈★紝鏋愭瀯涓ゆ”鑰屽鍚屼竴鍐呭瓨鍖哄煙閲婃斁涓ゆ寮曡搗鐨勭▼搴?core dump銆?/p> 閫夐」 -fpie鍜?nbsp;-fPIE涓?nbsp;-fpic鍙?nbsp;-fPIC鐨勭敤娉曞緢鐩鎬技錛屽尯鍒湪浜庡墠鑰呮繪槸灝嗙敓鎴愮殑浣嶇疆鏃犲叧浠g爜鐪嬩綔鏄睘浜庣▼搴忔湰韜紝騫剁洿鎺ラ摼鎺ヨ繘璇ュ彲鎵ц紼嬪簭錛岃岄潪瀛樺叆鍏ㄥ眬鍋忕Щ琛?nbsp;GOT涓紱榪欐牱錛屽浜庡悓鍚嶇殑闈欐佹垨鍏ㄥ眬瀵硅薄鐨勮闂紝鍏舵瀯閫犱笌鏋愭瀯鎿嶄綔灝嗕繚鎸佷竴涓瀵瑰簲銆?/p> 閫氳繃浣跨敤閫夐」 -fpie鎴?nbsp;-fPIE浠f浛 -fpic鎴栬?nbsp;-fPIC錛屼嬌寰楃敓鎴愮殑鍏變韓搴撲笉浼氫負闈欐佹垚鍛樺彉閲忔垨鍏ㄥ眬鍙橀噺鍦?nbsp;GOT涓垱寤哄搴旂殑鏉$洰錛屽悓鏃朵篃灝遍伩鍏嶄簡閽堝鍚屽悕闈欐佸璞?#8220;鏋勯犱竴嬈★紝鏋愭瀯涓ゆ”鐨勪笉褰撴搷浣溿?br /> Linux 涓嬮楦戒紶涔﹁璁″疄鐜?span lang="EN-US"> 1.緋葷粺鍔熻兘 鏍規(guī)嵁椋為附浼犱功鍗忚鍦?span lang="EN-US"> linux 涓嬪疄鐜伴楦戒紶杈撶▼搴?span lang="EN-US">,騫朵笖涓?span lang="EN-US"> windows 涓嬮楦藉吋瀹廣傚叿浣撳姛鑳芥ā鍧楀寘鎷敤鎴蜂笂綰?span lang="EN-US">,涓嬬嚎,鍒鋒柊鏌ョ湅鍦ㄧ嚎鐢ㄦ埛,鏀跺彂娑堟伅,浼犻佹枃浠?span lang="EN-US">/鏂囦歡澶瑰姛鑳芥ā鍧椼?span lang="EN-US"> 2.鍏蜂綋瀹炵幇 2.1 鍏抽敭鏁版嵁緇撴瀯 /*鍛戒護鐨勭粨鏋?span lang="EN-US">*/ typedef struct _command { int version;/*鍛戒護鐨勭増鏈?span lang="EN-US">*/ int seq;/*鍖呯紪鍙?span lang="EN-US">*/ char
srcName[100];/*鍙戦佽呭鍚?span lang="EN-US">*/ char
srcHost[100];/*鍙戦佽呬富鏈哄悕*/ int flag;/*鍛戒護*/ char
addtion[100];/*闄勫姞瀛楁*/ }command; /*鍦ㄧ嚎鐢ㄦ埛淇℃伅*/ typedef struct _userInfo { char
name[MAXLINE]; /*濮撳悕*/ char
host[MAXLINE]; /*涓繪満鍚?span lang="EN-US">*/ char
group[MAXLINE]; /*鎵鍦ㄧ殑緇勫悕*/ struct
sockaddr_in addr; /*鍦板潃淇℃伅*/ struct
_userInfo next; /*閾捐〃涓笅涓涓?span lang="EN-US">*/ }userInfo; /*鍦ㄧ嚎鐢ㄦ埛鍒楄〃*/ typedef struct _uList { userInfo
*userListHead; /*閾捐〃澶?span lang="EN-US">*/ userInfo
userListTail; /*閾捐〃灝?span lang="EN-US">*/ }uList; /*娑堟伅闃熷垪*/ typedef struct _mesList { command
*mesHead; command
*mesTail; }mesList; 2.2 紼嬪簭涓昏緇撴瀯 鏈▼搴忎富瑕侀噰鐢ㄥ綰跨▼緇撴瀯,鍒嗕負 receive(鎺ユ敹娑堟伅), process(澶勭悊鏀跺埌鐨勬秷鎭?span lang="EN-US">), sendData(鍙戦佹枃浠?span lang="EN-US">) 涓変釜瀛愮嚎紼嬨傜嚎紼嬮棿閫氫俊浜掓枼閿佷笌 Posix 淇″彿閲忚繘琛岄氫俊銆?span lang="EN-US"> 2.3 鍑芥暟鎺ュ彛 (1) /*浠庢枃浠舵弿榪扮fd涓鍙?span lang="EN-US">count涓瓧絎﹀瓨鍏?span lang="EN-US">buf涓?span lang="EN-US">*/ ssize_t
readn(int fd,void *buf,size_t count)錛?span lang="EN-US"> (2) /*灝?span lang="EN-US">buf鎵鎸囧悜鐨勫瓨鍌ㄥ尯涓殑len涓瓧絎﹀惛鍏ユ枃浠舵弿榪扮fd涓?span lang="EN-US">*/ ssize_t
writen(int fd,char *buf,int len); (3) /*鐢ㄤ簬瀛楃涓茶漿鎹?span lang="EN-US">,緗戠粶浼犺緭涓敤gb2312緙栫爜錛?span lang="EN-US">linux涓?span lang="EN-US">gtk鐢?span lang="EN-US">utf-8緙栫爜錛岄渶瑕佽繘琛岃漿鎹?span lang="EN-US">*/ int
code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char
*outbuf,int outlen); (4) /*鍦ㄧ敤鎴烽摼琛ㄤ腑鍔犲叆鏂扮敤鎴蜂俊鎭紝鍔犲叆鎴愬姛榪斿洖1錛屽惁鍒欒繑鍥?span lang="EN-US">0,浣跨敤userInfoMutex榪涜綰跨▼闂撮氫俊鎺у埗*/ int
pushBack(uList *list,userInfo user); (5) /*鍦ㄧ敤鎴烽摼琛ㄤ腑鍒犻櫎鎸囧畾鍦板潃淇℃伅鐨勭敤鎴鳳紝鍒犻櫎鎴愬姛鍚庤繑鍥?span lang="EN-US">1錛屽惁鍒欒繑鍥?span lang="EN-US">0錛屼嬌鐢?span lang="EN-US">userInfoMutex榪涜綰跨▼闂存帶鍒?span lang="EN-US">*/ int
delUser(uList *list, struct sockaddr_in addr); (6) /*鍒ゆ柇璇ョ敤鎴鋒槸鍚﹀凡緇忓瓨鍦紝宸茬粡瀛樺湪鍒欒繑鍥?span lang="EN-US">1錛屽惁鍒欒繑鍥?span lang="EN-US">0,浣跨敤userInfoMutex榪涜綰跨▼闂存帶鍒?span lang="EN-US">*/ int isExist(uList *list,struct sockaddr_in addr); (7)娓呯┖鐢ㄦ埛閾捐〃錛岄噴鏀劇┖闂達紝鐢ㄤ簬鐢ㄦ埛閫鍑哄拰鐢ㄦ埛鍒鋒柊鏃墮噴鏀劇┖闂?span lang="EN-US">,浣跨敤userInfoMutex榪涜綰跨▼闂存帶鍒?span lang="EN-US">*/ int destroyList(uList *list); (8)/*鍒涘緩鍛戒護瀛?span lang="EN-US">,com涓鴻榪斿洖鐨勫懡浠ゅ瓧,flag 涓烘秷鎭爣蹇?span lang="EN-US">,addtion 涓洪檮鍔犳爣蹇?span lang="EN-US">*/ void createCmd(command & com,int flag,char
addtion[]) (9)/*鍙戦佹秷鎭紝com涓鴻鍙戦佺殑娑堟伅錛?span lang="EN-US">servaddr涓鴻鍙戦佺殑鍦板潃錛?span lang="EN-US">attach涓烘枃浠墮檮浠朵俊鎭?span lang="EN-US">*/ void sendCmd(command com, struct sockaddr_in
servaddr,char attach[]); (10) /*鎶婃敹鍒扮殑娑堟伅鍔犲叆鍒版秷鎭槦鍒椾腑*/ void addMes(mesList *mHead,command cmd); (11) /*鎶婃秷鎭槦鍒椾腑澶撮儴鐨勮妭鐐規(guī)秷鎭彁鍙栧嚭鏉ョ敤浜庡鐞?span lang="EN-US">*/ int delMes(mesList *mHead,command *cmd); (12)/*鍒濆鍖栨搷浣滐紝椋為附鐧誨綍鏃跺垵濮嬪寲娑堟伅閾捐〃錛岀敤鎴烽摼琛紝淇″彿閲忥紝濂楁帴瀛椾俊鎭?span lang="EN-US">*/ void init(); (13)/*鐧誨綍鎿嶄綔,鍙戦佺敤鎴蜂笂綰挎秷鎭?span lang="EN-US">*/ void login(); (14)/*瑙f瀽鏀跺埌鐨勬秷鎭懡浠わ紝鎻愬彇鍚勪釜瀛楁*/ int
analysisCmd(command *cmd,char *buf); (15) /*鎺ユ敹娑堟伅綰跨▼澶勭悊鍑芥暟,灝嗘敹鍒扮殑娑堟伅鍔犲叆娑堟伅闃熷垪涓紝閫氳繃淇″彿閲?span lang="EN-US">waitNoFull鍜?span lang="EN-US">waitNoEmpty鍜屾秷鎭鐞嗙嚎紼嬭繘琛岄氫俊銆傛秷鎭槦鍒楃敤mesMutex涓庡叾浠栫嚎紼嬭繘琛岄氫俊錛屼繚璇佹秷鎭槦鍒楃殑姝g‘鎬?span lang="EN-US">*/ void
*receive(void *arg); (16)/*gtk鐣岄潰涓樉紺哄湪綰跨敤鎴蜂俊鎭?span lang="EN-US">*/ void showUser(uList *list); (17)/*鍦?span lang="EN-US">gtk鐣岄潰涓樉紺烘秷鎭?span lang="EN-US">*/ void showMessage(char *message); (18)/*鏄劇ず鏀跺埌鐨勪俊鎭?span lang="EN-US">*/ void showRecvMessage(char *host,char *message); (19)/*鍒嗘瀽鏂囦歡鐨勪俊鎭紝鎻愬彇鏈夌敤鐨勫瓧孌?span lang="EN-US">*/ void fileAnalysis(char *recv,int *fNum,char *fName,int
*fSize,int *fTime,int *fType); (20) /*淇濆瓨鏀跺埌鐨勫崟涓枃浠?span lang="EN-US">,saveName涓轟繚瀛樼殑鏂囦歡鍚?span lang="EN-US">*/ void saveSignalFile(char *saveName); (21)/*鍒嗘瀽鐩綍闄勪歡錛岃幏寰楃洰褰曟枃浠剁殑鏂囦歡鍚嶏紝鏂囦歡澶у皬錛屾枃浠剁被鍨?span lang="EN-US">*/ void getDirInfo(char *recv,char *fName,int *fSize,int
*fType); (22) /*淇濆瓨鐩綍,saveName涓鴻淇濆瓨鐨勭洰褰?span lang="EN-US">*/ void saveDir(char *saveName); (23)/*淇濆瓨鏂囦歡,recvType=1涓轟繚瀛樻枃浠訛紝recvType=2涓轟繚瀛樼殑鐩綍,浣跨敤fileMutex鏉ヨ緗簰鏂ユ?span lang="EN-US">*/ void saveFile(); (24)/*鏀跺埌鍗曚釜鏂囦歡*/ void receiveSignalFile(char *recvFileName); (25)/*鏀跺埌鍗曚釜鐩綍*/ void receiveDir(char *recvDirName); (26)/*鎺ユ敹鏂囦歡*/ void receiveFile(command cmd); (27)/*淇″彿澶勭悊綰跨▼,浠庢秷鎭槦鍒椾腑鍙栧嚭娑堟伅榪涜澶勭悊*/ void *process(void *arg); (28)/*鍙戦佹秷鎭?span lang="EN-US">*/ int sendMes(); (29) /*灝嗘枃浠跺悕榪涜杞崲*/ char *transName(char *fileName); (30)/*鍙戦佹枃浠?span lang="EN-US">*/ void sendFile(); (31)/*鍙戦佹枃浠跺す*/ void sendDir(); (32)/*鐢ㄦ埛鐐瑰嚮鍒鋒柊,鍒鋒柊鍦ㄧ嚎鐢ㄦ埛*/ void refresh(); (33) /*鐢ㄦ埛閫鍑?span lang="EN-US">*/ void quit(); (34)/*浼犺緭鏂囦歡澶規(guī)暟鎹紝閫掑綊鍑芥暟*/ void transferDir(int fd,char *dir); (35)/*鐩戝惉TCP濂楁帴鍙o紝鍙戦佹枃浠朵笌鏂囦歡澶圭嚎紼?span lang="EN-US">*/ void *sendData(void *arg); (36)/*鍒涘緩鑿滃崟*/ static void create_popup_menu(GtkWidget
*menu,GtkWidget *view); (37)/*鍙沖嚮閫変腑treeview,鏄劇ず浼犻佹枃浠朵笌鏂囦歡澶硅彍鍗?span lang="EN-US">*/ static gboolean showTreeView(GtkWidget
*eventBox,GdkEventButton *event,GtkWidget *menu); (38)/*閫夋嫨瑕佸彂閫佺殑鏂囦歡 */ static void selectFile(); (39)/*閫夋嫨瑕佸彂閫佺殑鏂囦歡澶?span lang="EN-US">*/ static void selectDir(); (40)/*閫夋嫨瑕佷繚瀛樼殑鏂囦歡鍚嶆垨鏂囦歡澶瑰悕*/ static void selectSaveFile(); 3.鎬葷粨 瀹炵幇浜?span lang="EN-US">linux涓嬮楦戒紶涔︾殑鍩烘湰鍔熻兘錛屽茍涓旇兘涓?span lang="EN-US">window涓嬮楦借繘琛岄氫俊錛屼紶鏂囦歡銆傜啛鎮(zhèn)変簡linux涓嬬綉緇滅紪紼嬶紝澶氱嚎紼嬬紪紼嬪強綰跨▼闂撮氫俊錛堜富瑕佺敤鍒頒俊鍙烽噺涓庝簰鏂ラ攣錛夈備絾鍔犲瘑瑙e瘑閭e潡娌℃湁瀹屾垚錛岀▼搴忕粨鏋勪笉鏄緢濂斤紝鐣岄潰鍋氬緱澶樊銆傛湁絀哄簲璇ョ湅鐪嬭璁℃ā寮?span lang="EN-US">. 鐣岄潰鎴浘錛堢晫闈㈡瘮杈冨瀮鍦?錛?/p>
闄勶細 椋為附鍗忚錛?http://bbs.chinaunix.net/viewthread.php?tid=1015775
]]>
]]>
鍥?1. 搴旂敤鍦烘櫙
鍥?2. 搴旂敤鍦烘櫙妯℃嫙浠g爜
娓呭崟 1. 鍔熻兘鍑芥暟 func_api1(int) void func_api1(int i) { printf("%s.\n", __FILE__); A::set(i); A::print(); return; }
娓呭崟 2. 闈欐佹垚鍛樺嚱鏁?A::set(int) void A::set(int num) { vec_int.clear(); for (int i = 0; i < num; i++) { vec_int.push_back(i); } return; }
娓呭崟 3. 闈欐佹垚鍛樺嚱鏁?A::print() void A::print() { for (int i = 0; i < vec_int.size(); i++) { printf("vec_int[%d] = %d, addr: %p.\n", i, vec_int[i], &vec_int[i]); } printf("vec_int addr: %p.\n", &vec_int); return; }
娓呭崟 4. 閫夐」 -fPIC 鐨勬祴璇曠粨鏋?/strong> $ export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH $ g++ -g -o lib1.so -fPIC-rdynamic -shared lib1/lib.c $ g++ -g -o lib2.so -fPIC-rdynamic -shared lib2/lib.c $ g++ -g -o test -L./ -l1 -l2 test.c $ ./test api1.h. vec_int[0] = 0, addr: 0x9cbf028. vec_int[1] = 1, addr: 0x9cbf02c. vec_int[2] = 2, addr: 0x9cbf030. vec_int[3] = 3, addr: 0x9cbf034. vec_int addr: 0xe89228. *** glibc detected *** ./test: double free or corruption (fasttop): 0x09cbf028*** ======= Backtrace:========= /lib/libc.so.6[0x2b2b16] /lib/libc.so.6(cfree+0x90)[0x2b6030] /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x5d1731] ./lib1.so(_ZN9__gnu_cxx13new_allocatorIiE10deallocateEPij+0x1d)[0xe88417] ./lib1.so(_ZNSt12_Vector_baseIiSaIiEE13_M_deallocateEPij+0x33)[0xe88451] ./lib1.so(_ZNSt12_Vector_baseIiSaIiEED2Ev+0x42)[0xe8849a] ./lib1.so(_ZNSt6vectorIiSaIiEED1Ev+0x60)[0xe8850c] ./lib2.so[0x961d6c] /lib/libc.so.6(__cxa_finalize+0xa9)[0x275c79] ./lib2.so[0x961c34] ./lib2.so[0x962d3c] /lib/ld-linux.so.2[0x23a7de] /lib/libc.so.6(exit+0xe9)[0x2759c9] /lib/libc.so.6(__libc_start_main+0xe4)[0x25fdf4] ./test(__gxx_personality_v0+0x45)[0x80484c1] ======= Memory map:======== ...... 00960000-00963000 r-xp 00000000 00:1b 7668734 ./lib2.so 00963000-00964000 rwxp 00003000 00:1b 7668734 ./lib2.so 00970000-00971000 r-xp 00970000 00:00 0 [vdso] 00e86000-00e89000 r-xp 00000000 00:1b 7668022 ./lib1.so 00e89000-00e8a000 rwxp 00003000 00:1b 7668022 ./lib1.so 08048000-08049000 r-xp 00000000 00:1b 7668748 ./test 08049000-0804a000 rw-p 00000000 00:1b 7668748 ./test 09cbf000-09ce0000 rw-p 09cbf000 00:00 0 [heap] ...... Abort(coredump) $
娓呭崟 5. objdump 鍒嗘瀽鍏變韓搴?lib1.so 鐨勮緭鍑?/strong> $ objdump -x -R lib1.so lib1.so: file format elf32-i386 ...... Sections: Idx Name Size VMA LMA File off Algn 0 .gnu.hash 000001e8 000000d4 000000d4 000000d4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA ...... 18 .dynamic 000000d8 0000301c 0000301c 0000301c 2**2 CONTENTS, ALLOC, LOAD, DATA 19 .got 00000014 000030f4 000030f4 000030f4 2**2 CONTENTS, ALLOC, LOAD, DATA 20 .got.plt 00000114 00003108 00003108 00003108 2**2 CONTENTS, ALLOC, LOAD, DATA ...... DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE ...... 000030f4 R_386_GLOB_DAT __gmon_start__ 000030f8 R_386_GLOB_DAT _Jv_RegisterClasses 000030fc R_386_GLOB_DAT _ZN1A7vec_intE 00003104 R_386_GLOB_DAT __cxa_finalize ......
娓呭崟 6. readelf 鍒嗘瀽鍏變韓搴?lib1.so 鐨勮緭鍑?/strong> $ objdump -x -R lib1.so lib1.so: file format elf32-i386 ...... Sections: Idx Name Size VMA LMA File off Algn 0 .gnu.hash 000001e8 000000d4 000000d4 000000d4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA ...... 18 .dynamic 000000d8 0000301c 0000301c 0000301c 2**2 CONTENTS, ALLOC, LOAD, DATA 19 .got 00000014 000030f4 000030f4 000030f4 2**2 CONTENTS, ALLOC, LOAD, DATA 20 .got.plt 00000114 00003108 00003108 00003108 2**2 CONTENTS, ALLOC, LOAD, DATA ...... DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE ...... 000030f4 R_386_GLOB_DAT __gmon_start__ 000030f8 R_386_GLOB_DAT _Jv_RegisterClasses 000030fc R_386_GLOB_DAT _ZN1A7vec_intE 00003104 R_386_GLOB_DAT __cxa_finalize ......
00e89000-00e8a000 rwxp 00003000 00:1b 7668022 ./lib1.so
娓呭崟 7. core 鏂囦歡鍒嗘瀽緇撴灉 $ gdb ./test core.28440 …… Core was generated by `./test'. Program terminated with signal 6, Aborted. #0 0x00970402 in __kernel_vsyscall () (gdb) (gdb) where #0 0x00970402 in __kernel_vsyscall () #1 0x00272d10 in raise () from /lib/libc.so.6 #2 0x00274621 in abort () from /lib/libc.so.6 #3 0x002aae5b in __libc_message () from /lib/libc.so.6 #4 0x002b2b16 in _int_free () from /lib/libc.so.6 #5 0x002b6030 in free () from /lib/libc.so.6 #6 0x005d1731 in operator delete () from /usr/lib/libstdc++.so.6 #7 0x00e88417 in __gnu_cxx::new_allocator<int>::deallocate (this=0xe89228, __p=0x9cbf028) at /usr/lib/gcc/i386-redhat-linux/.../ext/new_allocator.h:94 #8 0x00e88451 in std::_Vector_base<int, ... (this=0xe89228, __p=0x9cbf028, __n=4) at /usr/lib/gcc/.../include/c++/4.1.2/bits/stl_vector.h:133 #9 0x00e8849a in ~_Vector_base (this=0xe89228) at /usr/lib/gcc/.../include/c++/4.1.2/bits/stl_vector.h:119 #10 0x00e8850cin ~vector (this=0xe89228) at /usr/lib/gcc/.../stl_vector.h:272 #11 0x00961d6c in __tcf_0 () at lib2/lib.c:3 #12 0x00275c79 in __cxa_finalize () from /lib/libc.so.6 #13 0x00961c34 in __do_global_dtors_aux () from ./lib2.so #14 0x00962d3c in _fini () from ./lib2.so #15 0x0023a7de in _dl_fini () from /lib/ld-linux.so.2 #16 0x002759c9 in exit () from /lib/libc.so.6 #17 0x0025fdf4 in __libc_start_main () from /lib/libc.so.6 #18 0x080484c1 in _start () (gdb)
./lib1.so(_ZNSt6vectorIiSaIiEED1Ev+0x60)[0xe8850c]
娓呭崟 8. 閫夐」 -fPIE 鐨勬祴璇曠粨鏋?/strong> $ export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH $ g++ -g -o lib1.so -fPIE-rdynamic -shared lib1/lib.c $ g++ -g -o lib2.so -fPIE-rdynamic -shared lib2/lib.c $ g++ -g -pie -o test -L./ -l1 -l2 test.c $ ./test api1.h. vec_int[0] = 0, addr: 0x80e3028. vec_int[1] = 1, addr: 0x80e302c. vec_int[2] = 2, addr: 0x80e3030. vec_int[3] = 3, addr: 0x80e3034. vec_int addr: 0x75e224. $
杞嚜錛?a >http://www.ibm.com/developerworks/cn/linux/l-cn-sdlstatic/
]]>
RPC鏄痝libc鎻愪緵鐨勫嚱鏁板弬鏁?榪斿洖鍊煎皝瑁呮湇鍔? 騫跺皢灝佽緇撴灉閫氳繃緗戠粶浼犲埌鏈嶅姟鍣?
RPC鏈嶅姟绔鍏堣鍚姩portmapper鏈嶅姟.
嫻嬭瘯涓涓畝鍗曠殑RPC浼犺緭紺轟緥, 鍏堝畾涔変竴涓ā鏉挎枃浠秚est.x
version VERSION{
int int_echo(int)=1;
int get_str_len(string)=2;
int add ( int, int ) = 3;
}=1;
}=30000;
鐒跺悗鍙互鐢╮pcgen鐢熸垚涓涓狹akefile:
榪欎細鐢熸垚Makefile, 瀹㈡埛绔拰鏈嶅姟绔殑紼嬪簭, 鍜屽嚱鏁扮ず渚?
鎴戜滑鎵嬪伐淇敼涓涓婱akefile
# Parameters
CLIENT = test_client
SERVER = test_server
SOURCES_CLNT.c =
SOURCES_CLNT.h =
SOURCES_SVC.c =
SOURCES_SVC.h =
SOURCES.x = test.x
TARGETS_SVC.c = test_svc.c test_server.c test_xdr.c
TARGETS_CLNT.c = test_clnt.c test_client.c test_xdr.c
TARGETS = test.h test_xdr.c test_clnt.c test_svc.c
OBJECTS_CLNT = $(SOURCES_CLNT.c:%.c=%.o) $(TARGETS_CLNT.c:%.c=%.o)
OBJECTS_SVC = $(SOURCES_SVC.c:%.c=%.o) $(TARGETS_SVC.c:%.c=%.o)
# Compiler flags
CFLAGS += -g -pipe
LDLIBS += -lnsl
RPCGENFLAGS = -N
# Targets
all : $(CLIENT) $(SERVER)
$(TARGETS) : $(SOURCES.x)
rpcgen $(RPCGENFLAGS) $(SOURCES.x)
$(OBJECTS_CLNT) : $(SOURCES_CLNT.c) $(SOURCES_CLNT.h) $(TARGETS_CLNT.c)
$(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) $(TARGETS_SVC.c)
$(CLIENT) : $(OBJECTS_CLNT)
$(LINK.c) -o $(CLIENT) $(OBJECTS_CLNT) $(LDLIBS)
$(SERVER) : $(OBJECTS_SVC)
$(LINK.c) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)
clean:
$(RM) core $(TARGETS) $(OBJECTS_CLNT) $(OBJECTS_SVC) $(CLIENT) $(SERVER)
淇敼test_server.c鏈嶅姟绔殑澶勭悊鍑芥暟, 鎻愪緵3縐嶆湇鍔?
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
int *
int_echo_1_svc(int arg1, struct svc_req *rqstp)
{
static int result;
//echo.
result=arg1;
printf("[RPC1] source=%d, echo=%d\n", arg1, result);
return &result;
}
int *
get_str_len_1_svc(char *arg1, struct svc_req *rqstp)
{
static int result;
//get strlen.
result=strlen(arg1);
printf("[PRC2] str=%s, len=%d\n", arg1, result);
return &result;
}
int *
add_1_svc(int arg1, int arg2, struct svc_req *rqstp)
{
static int result;
result=arg1+arg2;
printf("[RPC3] %d+%d=%d\n", arg1, arg2, result);
return &result;
}
瀹㈡埛绔痶est_client.c, 璋冪敤榪欎笁縐嶆湇鍔?
* This is sample code generated by rpcgen.
* These are only templates and you can use them
* as a guideline for developing your own functions.
*/
#include "test.h"
void
testprog_1(char *host)
{
CLIENT *clnt;
int *result_1;
int int_echo_1_arg1=55;
int *result_2;
char *get_str_len_1_arg1="Hello, world";
int *result_3;
int add_1_arg1=10;
int add_1_arg2=20;
clnt = clnt_create (host, TESTPROG, VERSION, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
result_1 = int_echo_1(int_echo_1_arg1, clnt);
if (result_1 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
else
printf("[PRC1] echo %d, source %d\n", *result_1,
int_echo_1_arg1);
result_2 = get_str_len_1(get_str_len_1_arg1, clnt);
if (result_2 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
else
printf("[RPC2] return %d, should %d\n", *result_2,
strlen(get_str_len_1_arg1));
result_3 = add_1(add_1_arg1, add_1_arg2, clnt);
if (result_3 == (int *) NULL) {
clnt_perror (clnt, "call failed");
}
else
printf("[PRC3] %d+%d=%d\n", add_1_arg1, add_1_arg2,
*result_3);
clnt_destroy (clnt);
}
鐢熸垚鍙墽琛岀▼搴弔est_server鍜宼est_client.
鎴戜滑鍚姩./test_server, 鐢╮pcinfo鐪嬬湅:
program vers proto port
100000 2 tcp 111 portmapper
30000 1 udp 36307
30000 1 tcp 34883
Bingo! 鍚姩鎴愬姛.
鍐嶅紑涓粓绔? 灝濊瘯涓涓嬭皟鐢?
./test_client 127.0.0.1
[PRC1] echo 55, source 55
[RPC2] return 12, should 12
[PRC3] 10+20=30
姝f槸鎴戜滑鏈熸湜鐨?
Add By錛欽ackxiang
]]>
錛?錛塅IFO
FIFO鎸囦唬鍏堣繘鍏堝嚭錛團irst in,First out),linux涓殑FIFO綾諱技綆¢亾銆傚畠鏄竴涓崟鍚戯紙鍗婂弻宸ワ級鏁版嵁嫻併備笉鍚屼簬綆¢亾鐨勬槸錛屾瘡涓狥IFO鏈変竴涓礬寰勫悕涓庝箣鍏寵仈錛屼粠鑰屽厑璁告棤浜茬紭鍏崇郴鐨勮繘紼嬭闂悓涓涓狥IFO銆侳IFO涔熺О涓烘湁鍚嶇閬撱侳IFO鐢眒kfifo鍑芥暟鍒涘緩銆傚叾涓璸athname鏄竴涓櫘閫氱殑Unix璺緞鍚嶏紝瀹冩槸璇IFO鐨勫悕瀛椼俶kfifo 鍑芥暟宸查殣鍚寚瀹?O_CREAT|O_EXCL. 涔熷氨鏄錛屽畠閭d箞鍒涘緩涓涓柊鐨凢IFO錛岃涔堣繑鍥炰竴涓狤EXIST閿欒錛堝鏋滄墍鎸囧畾鐨勫悕瀛楃殑FIFO宸茬粡瀛樺湪錛夈傚鏋滀笉鎯沖笇鏈涘垱寤轟竴涓柊鐨凢IFO,閭e氨鏀逛負璋冪敤open鑰屼笉鏄痬kfifo.瑕佹墦寮涓涓凡瀛樺湪鐨凢IFO鎴栧垱寤轟竴涓柊鐨凢IFO,搴斿厛璋冪敤mkfifo,鍐嶆鏌ュ畠鏄惁榪斿洖EEXIST閿欒錛岃嫢榪斿洖璇ラ敊璇垯鏀逛負璋冪敤open.mkfifo銆鍛戒護涔熻兘鍒涘緩FIFO銆傚彲浠ヤ粠shell鑴氭湰鎴栧懡浠よ涓嬌鐢ㄥ畠銆傚湪鍒涘緩鍑轟竴涓狥IFO鍚庯紝瀹冨繀欏繪垨鑰呮墦寮鏉ヨ錛屾垨鑰呮墦寮鏉ュ啓錛屾墍鐢ㄧ殑鍙互鏄痮pen鍑芥暟錛屼篃鍙互鏄煇涓爣鍑咺/O鎵撳紑鍑芥暟銆侳IFO涓嶈兘鎵撳紑鏉ユ棦璇誨張鍐欙紝鍥犱負瀹冩槸鍗婂弻宸ョ殑銆傚綆¢亾鎴朏IFO鐨剋rite鎬繪槸寰鏈熬娣誨姞鏁版嵁錛屽瀹冧滑鐨剅ead鍒欐繪槸浠庡紑澶磋繑鍥炴暟鎹傚鏋滃綆¢亾鎴朏IFO璋冪敤lseek,閭e氨榪斿洖ESPIPE閿欒銆?br />
錛堬紦錛塒osix銆娑堟伅闃熷垪
娑堟伅闃熷垪鍙涓烘槸涓涓秷鎭摼琛ㄣ傛湁瓚沖鍐欐潈闄愮殑綰跨▼鍙線闃熷垪涓斁緗秷鎭紝鏈夎凍澶熻鏉冮檺鐨勭嚎紼嬪彲浠庨槦鍒椾腑鍙栬蛋娑堟伅銆傛瘡涓秷鎭兘鏄竴涓褰曪紝瀹冪敱鍙戦佽呰祴浜堜竴涓紭鍏堢駭銆傚湪鏌愪釜榪涚▼寰涓涓槦鍒楀啓鍏ユ秷鎭箣鍓嶏紝騫朵笉闇瑕佸彟澶栨煇涓繘紼嬪湪璇ラ槦鍒椾笂絳夊緟娑堟伅鐨勫埌杈俱傝繖璺熺閬撳拰FIFO鏄浉鍙嶇殑錛屽鍚庤呮潵璇達紝闄ら潪璇誨嚭鑰呭凡瀛樺湪錛屽惁鍒欏厛鏈夊啓鍏ヨ呮槸娌℃湁鎰忎箟鐨勩備竴涓繘紼嬪彲浠ュ線鏌愪釜闃熷垪鍐欏叆涓浜涙秷鎭紝鐒跺悗緇堟錛屽啀璁╁彟澶栦竴涓繘紼嬪湪浠ュ悗鏌愪釜鏃跺埢璇誨嚭榪欎簺娑堟伅銆傛秷鎭槦鍒楀叿鏈夐殢鍐呮牳鐨勬寔緇э紝榪欒窡綆¢亾鍜孎IFO涓嶄竴鏍楓侾osix娑堟伅闃熷垪鍜孲ystem V娑堟伅闃熷垪銆傝繖涓ょ粍鍑芥暟闂村瓨鍦ㄨ澶氱浉浼兼э紝浣嗕篃鏈変富瑕佺殑鍖哄埆
錛? 瀵筆osix娑堟伅闃熷垪鐨勮鎬繪槸榪斿洖鏈楂樹紭鍏堢駭鐨勬渶鏃╂秷鎭紝瀵筍ystem銆錛舵秷鎭槦鍒楃殑璇誨垯鍙互榪斿洖浠繪剰鎸囧畾浼樺厛綰х殑娑堟伅銆?br />錛?褰撳線涓涓┖闃熷垪鏀劇疆涓涓秷鎭椂錛孭osix銆娑堟伅闃熷垪鍏佽浜х敓涓涓俊鍙鋒垨鍚姩涓涓嚎紼嬨係ystem銆錛舵秷鎭槦鍒楀垯涓嶆彁渚涚被浼兼満鍒躲?br />
闃熷垪涓殑姣忎釜娑堟伅鍏鋒湁濡備笅灞炴э細
錛?涓涓棤絎﹀彿鏁存暟浼樺厛綰э紙Posix錛夋垨涓涓暱鏁存暟綾誨瀷(System V).
2.娑堟伅鐨勬暟鎹儴鍒嗛暱搴︼紙鍙互涓猴紣錛?
3.鏁版嵁鏈韓錛堝鏋滈暱搴﹀ぇ浜庯紣錛?br />
鍑芥暟鎺ュ彛
錛? mqd_t mq_open(const char *name,int oflag,...)
mq_open鍑芥暟鍒涘緩涓涓柊鐨勬秷鎭槦鍒楁垨鎵撳紑涓涓凡瀛樺湪鐨勬秷鎭槦鍒?br />錛?int mq_close(mqd_t mqdes);
mq_close鍑芥暟鍏抽棴涓涓秷鎭槦鍒椼?br />錛?int mq_unlink(const char *name);
浠庣郴緇熶腑鍒犻櫎鐢ㄤ綔絎竴涓弬鏁扮殑鏌愪釜name.
4. int mq_getattr(mqd_t mqdes,struct mq_attr *attr);
int mq_setattr(mqd_t mqdes,const struct mq_attr *attr,struct mq_attr *oattr);
姣忎釜娑堟伅闃熷垪鏈夊洓涓睘鎬э紝mq_getattr榪斿洖鎵鏈夎繖浜涘睘鎬э紝mq_setattr鍒欒緗叾涓煇涓睘鎬с?br />struct mq_attr{
long mq_flags;
long mq_maxmsg;
long mq_msgsize;
long mq_curmsgs;
};
銆int mq_receive(mqd_t mqdes,char *ptr,size_t len,unsigned int *priop);
錛?int mq_notify(mqd_t mqdes,const struct sigevent *motification);
緇撴瀯浣擄細
union sigval{
int sival_int;
void *sival_ptr;
};
struct sigevent
{
int sigev_notify;
int sigev_signo;
union sigval sigev_value;
void (*sigev_notify_function)(union sigval);
pthread_attr_t *sigev_notify_attributes;
};
鍙傝冿細Unix榪涚▼闂撮氫俊
]]>
錛?錛夊悓姝ワ紙浜掓枼閿侊紝鏉′歡鍙橀噺錛岃鍐欓攣錛屼俊鍙烽噺錛?br />錛?錛夊叡浜唴瀛樺尯錛堝尶鍚嶅叡浜唴瀛樺尯錛屾湁鍚嶅叡浜唴瀛樺尯錛?br />錛?錛夎繃紼嬭皟鐢紙Solaris闂紝Sun RPC錛?br />
linux榪涚▼闂寸殑淇℃伅鍏變韓鍙互鍒嗕負
錛?錛?鍩轟簬鏂囦歡緋葷粺鐨勫叡浜?br />錛?錛?鍩轟簬鍐呮牳鐨勫叡浜?br />錛?錛?鍩轟簬鍏變韓鍐呭瓨鍖虹殑鍏變韓
IPC瀵硅薄鐨勬寔緇?br />錛?錛夐殢榪涚▼闂存寔緇殑IPC瀵硅薄涓鐩村瓨鍦ㄥ埌鎵撳紑鐫璇ュ璞$殑鏈鍚庝竴涓繘紼嬪叧闂瀵硅薄鐨勬渶鍚庝竴涓繘紼嬪叧闂瀵硅薄涓烘銆?br />錛?錛夐殢鍐呮牳鎸佺畫鐨処PC瀵硅薄涓鐩村瓨鍦ㄥ埌鍐呮牳閲嶆柊鑷婦鎴栨樉寮忓垹闄よ瀵硅薄涓烘銆?br />錛?錛夐殢鏂囦歡緋葷粺鎸佺畫鐨処PC瀵硅薄涓鐩村瓨鍦ㄥ埌鏄劇ず鍒犻櫎璇ュ璞′負姝€傚嵆浣跨郴緇熻嚜涓句簡錛岃瀵硅薄榪樻槸瀛樺湪鐨勩?br />
IPC綾誨瀷 鎸佺畫鎬?br />綆¢亾 闅忚繘紼?br />FIFO 闅忚繘紼?br />
Posix浜掓枼閿?nbsp; 闅忚繘紼?br />Posix鏉′歡鍙橀噺 闅忚繘紼?br />Posix璇誨啓閿?nbsp; 闅忚繘紼?br />fcntl璁板綍涓婇攣 闅忚繘紼?br />
Posix娑堟伅闃熷垪 闅忓唴鏍?br />Posix鏈夊悕淇″彿閲?nbsp; 闅忓唴鏍?br />Posix鍩轟簬鍐呭瓨鐨勪俊鍙烽噺 闅忚繘紼?br />Posix鍏變韓鍐呭瓨鍖?nbsp; 闅忓唴鏍?br />
System V娑堟伅闃熷垪 闅忓唴鏍?br />System V淇″彿閲?nbsp; 闅忓唴鏍?br />System V鍏變韓鍐呭瓨鍖?nbsp; 闅忓唴鏍?br />
TCP濂楁帴瀛?nbsp; 闅忚繘紼?br />UDP濂楁帴瀛?nbsp; 闅忚繘紼?br />Unix鍩熷鎺ュ瓧 闅忚繘紼?br />
鍚嶅瓧絀洪棿錛?br /> 褰撲袱涓垨澶氫釜鏃犱翰緙樺叧緋葷殑榪涚▼浣跨敤鏌愮綾誨瀷鐨処PC瀵硅薄鏉ュ郊姝や氦鎹俊鎭椂錛岃IPC瀵硅薄蹇呴』鏈変竴涓煇縐嶅艦寮忕殑鍚嶅瓧鎴栬呮爣璇嗙錛岃繖鏍峰叾涓竴涓繘紼嬶紙寰寰鏄湇鍔″櫒錛夊彲浠ュ垱寤鴻IPC瀵硅薄錛屽叾浣欒繘紼嬪垯鍙互鎸囧畾鍚屼竴涓狪PC瀵硅薄銆?br />
IPC綾誨瀷 鐢ㄤ簬鎵撳紑鎴栧垱寤篒PC鐨勫悕瀛楃┖闂?nbsp; IPC鎵撳紑鍚庣殑鏍囪瘑
綆¢亾 娌℃湁鍚嶅瓧 鎻忚堪絎?br /> FIFO 璺緞鍚?nbsp; 鎻忚堪絎?br />
Posix浜掓枼閿?nbsp; 娌℃湁鍚嶅瓧 pthread_mutex_t鎸囬拡
Posix鏉′歡鍙橀噺 娌℃湁鍚嶅瓧 pthread_cond_t鎸囬拡
Posix璇誨啓閿?nbsp; 娌℃湁鍚嶅瓧 pthread_rwlock_t鎸囬拡
fcntl璁板綍涓婇攣 璺緞鍚?nbsp; 鎻忚堪絎?br />
Posix娑堟伅闃熷垪 Posix IPC鍚嶅瓧 mqd_t鍊?br />Posix鏈夊悕淇″彿閲?nbsp; Posix IPC鍚嶅瓧 sem_t鎸囬拡
Posix鍩轟簬鍐呭瓨鐨勪俊鍙烽噺 娌℃湁鍚嶅瓧 sem_t鎸囬拡
Posix鍏變韓鍐呭瓨鍖?nbsp; Posix IPC鍚嶅瓧 鎻忚堪絎?br />
System V娑堟伅闃熷垪 key_t閿?nbsp; System V IPC鏍囪瘑絎?br />System V 淇″彿閲?nbsp; key_t閿?nbsp; System V IPC鏍囪瘑絎?br />System V鍏變韓鍐呭瓨鍖?nbsp; key_t閿? System V IPC 鏍囪瘑絎?br />
闂? 璺緞鍚? 鎻忚堪絎?br />sun RPC 紼嬪簭/鐗堟湰 RPC鍙ユ焺
TCP濂楁帴瀛? IP鍦板潃涓嶵CP 绔彛 鎻忚堪絎?br />UDP濂楁帴瀛? IP鍦板潃涓嶶DP绔彛 鎻忚堪絎?br />Unix鍩熷鎺ュ瓧 璺緞鍚? 鎻忚堪絎?
]]>
錛?錛夐鍏堣鍋氱殑鏄皟鐢╱mask灝嗘枃浠舵ā寮忓垱寤哄睆钄藉瓧璁劇疆涓?.鐢辯戶鎵垮緱鏉ョ殑鏂囦歡妯″紡鍒涘緩灞忚斀瀛楀彲鑳戒細鎷掔粷璁劇疆鏌愪簺鏉冮檺銆?br />錛?錛夎皟鐢╢ork錛岀劧鍚庝嬌鐖惰繘紼嬮鍑猴紙exit錛?榪欐牱鍋氬疄鐜頒簡涓嬮潰鍑犵偣錛氱涓錛屽鏋滆瀹堟姢榪涚▼鏄綔涓轟竴鏉$畝鍗晄hell鍛戒護鍚姩鐨勶紝閭d箞鐖惰繘紼嬬粓姝嬌寰梥hell璁や負榪欐潯鍛戒護宸茬粡鎵ц瀹屾瘯銆傜浜岋紝瀛愯繘紼嬬戶鎵夸簡鐖惰繘紼嬬殑榪涚▼緇処D,浣嗗叿鏈変竴涓柊鐨勮繘紼婭D,榪欏氨淇濊瘉浜嗗瓙榪涚▼涓嶆槸涓涓繘紼嬬粍鐨勭粍闀胯繘紼嬨傝繖瀵逛簬涓嬮潰灝辮鍋氱殑setsid璋冪敤鏄繀瑕佺殑鍓嶆彁鏉′歡銆?br />錛?錛夎皟鐢╯etsid浠ュ垱寤轟竴涓柊浼氳瘽錛屾槸璋冪敤榪涚▼錛氾紙a)鎴愪負鏂頒細璇濈殑棣栬繘紼嬶紝錛坆錛夋垚涓轟竴涓柊榪涚▼緇勭殑緇勯暱榪涚▼錛岋紙c錛夋病鏈夋帶鍒剁粓绔傚湪鏈変簺浜哄緩璁湪姝ゆ椂鍐嶆璋冪敤 fork,騫舵槸鐖惰繘紼嬬粓姝€傜浜屼釜瀛愯繘紼嬩綔涓哄畧鎶よ繘紼嬬戶緇繍琛屻傝繖鏍峰氨淇濊瘉浜嗚瀹堟姢榪涚▼涓嶆槸浼氳瘽棣栬繘紼嬨?br />錛?錛夊皢褰撳墠宸ヤ綔鐩綍鏇存敼涓烘牴鐩綍銆?br />錛?錛夊叧闂笉鍐嶉渶瑕佺殑鏂囦歡鎻忚堪絎︺傝繖浣垮畧鎶よ繘紼嬩笉鍐嶆寔鏈変粠鍏剁埗榪涚▼緇ф壙鏉ョ殑鏌愪簺鏂囦歡鎻忚堪絎︺?br />錛?錛夋煇浜涘畧鎶よ繘紼嬫墦寮/dev/null浣垮叾鍏鋒湁鏂囦歡鎻忚堪絎?錛?錛?.榪欐牱錛屼換浣曚竴涓瘯鍥捐鏍囧噯杈撳叆錛屽啓鏍囧噯杈撳嚭鎴栨爣鍑嗗嚭閿欑殑搴撲緥紼嬮兘涓嶄細浜х敓浠諱綍鏁堟灉銆?br />
鍙傝冿細UNIX鐜楂樼駭緙栫▼
]]>
錛?錛夊叡浜唴瀛?br>錛?錛夎繙紼嬭皟鐢?br>
]]>
]]>