锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品五月天,亚洲精品一区二区在线,国产精品视频免费在线观看 http://www.shnenglu.com/yehongly/archive/2008/10/22/64677.html鑼?/dc:creator>鑼?/author>Wed, 22 Oct 2008 01:31:00 GMT http://www.shnenglu.com/yehongly/archive/2008/10/22/64677.html http://www.shnenglu.com/yehongly/comments/64677.html http://www.shnenglu.com/yehongly/archive/2008/10/22/64677.html#Feedback 0 http://www.shnenglu.com/yehongly/comments/commentRss/64677.html http://www.shnenglu.com/yehongly/services/trackbacks/64677.html Linux鐜榪涚▼闂撮氫俊錛堜笁錛夛細(xì)娑堟伅闃熷垪
鏈郴鍒楁枃绔犱腑鐨勫墠涓ら儴鍒嗭紝鎴戜滑鎺㈣綆¢亾 鍙?font color="#003399">淇″彿涓ょ閫氫俊鏈哄埗錛屾湰鏂囧皢娣卞叆絎笁閮ㄥ垎錛屼粙緇嶇郴緇?V 娑堟伅闃熷垪鍙?qiáng)鍏剁浉搴?API銆?/blockquote>
娑堟伅闃熷垪錛堜篃鍙仛鎶ユ枃闃熷垪錛夎兘澶熷厠鏈嶆棭鏈焨nix閫氫俊鏈哄埗鐨勪竴浜涚己鐐廣備綔涓烘棭鏈焨nix閫氫俊鏈哄埗涔嬩竴鐨勪俊鍙瘋兘澶熶紶閫佺殑淇℃伅閲忔湁闄愶紝鍚庢潵铏界劧
POSIX
1003.1b鍦ㄤ俊鍙風(fēng)殑瀹炴椂鎬ф柟闈綔浜?jiǎn)鎷擈q匡紝浣垮緱淇″彿鍦ㄤ紶閫掍俊鎭噺鏂歸潰鏈変簡(jiǎn)鐩稿綋紼嬪害鐨勬敼榪涳紝浣嗘槸淇″彿榪欑閫氫俊鏂瑰紡鏇村儚"鍗蟲椂"鐨勯氫俊鏂瑰紡錛屽畠瑕佹眰鎺ュ彈淇″彿
鐨勮繘紼嬪湪鏌愪釜鏃墮棿鑼冨洿鍐呭淇″彿鍋氬嚭鍙嶅簲錛屽洜姝よ淇″彿鏈澶氬湪鎺ュ彈淇″彿榪涚▼鐨勭敓鍛藉懆鏈熷唴鎵嶆湁鎰忎箟錛屼俊鍙鋒墍浼犻掔殑淇℃伅鏄帴榪戜簬闅忚繘紼嬫寔緇殑姒傚康
錛坧rocess-persistent錛夛紝瑙?font color="#003399">闄勫綍 1錛涚閬撳強(qiáng)鏈夊悕綆¢亾鍙?qiáng)鏈夊悕绠¢亾鍒欐槸鍏稿瀷鐨勯殢杩浗E嬫寔緇璉PC錛屽茍涓旓紝鍙兘浼犻佹棤鏍煎紡鐨勫瓧鑺傛祦鏃犵枒浼?xì)缁欏簲鐢ńE嬪簭寮鍙戝甫鏉ヤ笉渚匡紝鍙﹀錛屽畠鐨勭紦鍐插尯澶у皬涔熷彈鍒伴檺鍒躲?/p>
娑堟伅闃熷垪灝辨槸涓涓秷鎭殑閾捐〃銆傚彲浠ユ妸娑堟伅鐪嬩綔涓涓褰曪紝鍏鋒湁鐗瑰畾鐨勬牸寮忎互鍙?qiáng)鐗瑰畾鐨勪紭鍏埦Uс傚娑堟伅闃熷垪鏈夊啓鏉冮檺鐨勮繘紼嬪彲浠ュ悜涓寜鐓т竴瀹氱殑瑙勫垯娣誨姞鏂版秷鎭紱瀵規(guī)秷鎭槦鍒楁湁璇繪潈闄愮殑榪涚▼鍒欏彲浠ヤ粠娑堟伅闃熷垪涓璧版秷鎭傛秷鎭槦鍒楁槸闅忓唴鏍告寔緇殑錛堝弬瑙?font color="#003399">闄勫綍 1錛夈?/p>
鐩墠涓昏鏈変袱縐嶇被鍨嬬殑娑堟伅闃熷垪錛歅OSIX娑堟伅闃熷垪浠ュ強(qiáng)緋葷粺V娑堟伅闃熷垪錛岀郴緇烿娑堟伅闃熷垪鐩墠琚ぇ閲忎嬌鐢ㄣ傝冭檻鍒扮▼搴忕殑鍙Щ妞嶆э紝鏂板紑鍙戠殑搴旂敤紼嬪簭搴斿敖閲忎嬌鐢≒OSIX娑堟伅闃熷垪銆?/p>
鍦ㄦ湰緋誨垪涓撻鐨勫簭錛堟繁鍒葷悊瑙inux榪涚▼闂撮氫俊錛圛PC錛夛級(jí)涓紝鎻愬埌瀵逛簬娑堟伅闃熷垪銆佷俊鍙風(fēng)伅銆佷互鍙?qiáng)鍏变韩鍐呭瓨鍖烘潵璇村Q屾湁涓や釜瀹炵幇鐗堟湰錛歅OSIX鐨勪互
鍙?qiáng)绯痪l烿鐨勩侺inux鍐呮牳錛堝唴鏍?.4.18錛夋敮鎸丳OSIX淇″彿鐏丳OSIX鍏變韓鍐呭瓨鍖轟互鍙?qiáng)POSIX娑堟伅闃熷垪錛屼絾瀵逛簬涓繪祦Linux鍙戣鐗堟湰涔嬩竴
redhad8.0錛堝唴鏍?.4.18錛夛紝榪樻病鏈夋彁渚涘POSIX榪涚▼闂撮氫俊API鐨勬敮鎸侊紝涓嶈繃搴旇鍙槸鏃墮棿涓婄殑浜嬨?/p>
鍥犳錛屾湰鏂囧皢涓昏浠嬬粛緋葷粺V娑堟伅闃熷垪鍙?qiáng)鍏剁浉搴擜PI銆?strong>鍦ㄦ病鏈夊0鏄庣殑鎯呭喌涓嬶紝浠ヤ笅璁ㄨ涓寚鐨勯兘鏄郴緇烿娑堟伅闃熷垪銆?/strong>
涓銆佹秷鎭槦鍒楀熀鏈蹇?/font>
緋葷粺V娑堟伅闃熷垪鏄殢鍐呮牳鎸佺畫鐨勶紝鍙湁鍦ㄥ唴鏍擱噸璧鋒垨鑰呮樉紺哄垹闄や竴涓秷鎭槦鍒楁椂錛岃娑堟伅闃熷垪鎵嶄細(xì)鐪熸琚垹闄ゃ傚洜姝ょ郴緇熶腑璁板綍娑堟伅闃熷垪鐨勬暟鎹粨鏋勶紙struct ipc_ids msg_ids錛変綅浜庡唴鏍鎬腑錛岀郴緇熶腑鐨勬墍鏈夋秷鎭槦鍒楅兘鍙互鍦ㄧ粨鏋刴sg_ids涓壘鍒拌闂叆鍙c?
娑堟伅闃熷垪灝辨槸涓涓秷鎭殑閾捐〃銆傛瘡涓秷鎭槦鍒楅兘鏈変竴涓槦鍒楀ご錛岀敤緇撴瀯struct msg_queue鏉ユ弿榪幫紙鍙傝闄勫綍 2 錛夈傞槦鍒楀ご涓寘鍚簡(jiǎn)璇ユ秷鎭槦鍒楃殑澶ч噺淇℃伅錛屽寘鎷秷鎭槦鍒楅敭鍊箋佺敤鎴稩D銆佺粍ID銆佹秷鎭槦鍒椾腑娑堟伅鏁扮洰絳夌瓑錛岀敋鑷寵褰曚簡(jiǎn)鏈榪戝娑堟伅闃熷垪璇誨啓榪涚▼鐨処D銆傝鑰呭彲浠ヨ闂繖浜涗俊鎭紝涔熷彲浠ヨ緗叾涓殑鏌愪簺淇℃伅銆?
涓嬪浘璇存槑浜?jiǎn)鍐呮犳笌娑堟伅闃熷垪鏄庢牱寤虹珛璧瘋仈緋葷殑錛?br>鍏朵腑錛歴truct ipc_ids msg_ids鏄唴鏍鎬腑璁板綍娑堟伅闃熷垪鐨勫叏灞鏁版嵁緇撴瀯錛泂truct msg_queue鏄瘡涓秷鎭槦鍒楃殑闃熷垪澶淬?
浠庝笂鍥懼彲浠ョ湅鍑猴紝鍏ㄥ眬鏁版嵁緇撴瀯 struct ipc_ids msg_ids 鍙互璁塊棶鍒版瘡涓秷鎭槦鍒楀ご鐨勭涓涓垚鍛橈細(xì)struct
kern_ipc_perm錛涜屾瘡涓猻truct
kern_ipc_perm鑳藉涓庡叿浣撶殑娑堟伅闃熷垪瀵瑰簲璧鋒潵鏄洜涓哄湪璇ョ粨鏋勪腑錛屾湁涓涓猭ey_t綾誨瀷鎴愬憳key錛岃宬ey鍒欏敮涓紜畾涓涓秷鎭槦鍒椼?
kern_ipc_perm緇撴瀯濡備笅錛?/p>
struct kern_ipc_perm{ //鍐呮牳涓褰曟秷鎭槦鍒楃殑鍏ㄥ眬鏁版嵁緇撴瀯msg_ids鑳藉璁塊棶鍒拌緇撴瀯錛?br> key_t key; //璇ラ敭鍊煎垯鍞竴瀵瑰簲涓涓秷鎭槦鍒?br> uid_t uid; gid_t gid; uid_t cuid; gid_t cgid; mode_t mode; unsigned long seq; }
浜屻佹搷浣滄秷鎭槦鍒?/font>
瀵規(guī)秷鎭槦鍒楃殑鎿嶄綔鏃犻潪鏈変笅闈笁縐嶇被鍨嬶細(xì)
1銆?鎵撳紑鎴栧垱寤烘秷鎭槦鍒?br>娑堟伅闃熷垪鐨勫唴鏍告寔緇ц姹傛瘡涓秷鎭槦鍒楅兘鍦ㄧ郴緇熻寖鍥村唴瀵瑰簲鍞竴鐨勯敭鍊鹼紝鎵浠ワ紝瑕佽幏寰椾竴涓秷鎭槦鍒楃殑鎻忚堪瀛楋紝鍙渶鎻愪緵璇ユ秷鎭槦鍒楃殑閿煎嵆鍙紱
娉細(xì)娑堟伅闃熷垪鎻忚堪瀛楁槸鐢卞湪緋葷粺鑼冨洿鍐呭敮涓鐨勯敭鍊肩敓鎴愮殑錛岃岄敭鍊煎彲浠ョ湅浣滃搴旂郴緇熷唴鐨勪竴鏉¤礬緇忋?/p>
2銆?璇誨啓鎿嶄綔
娑堟伅璇誨啓鎿嶄綔闈炲父綆鍗曪紝瀵瑰紑鍙戜漢鍛樻潵璇達(dá)紝姣忎釜娑堟伅閮界被浼煎涓嬬殑鏁版嵁緇撴瀯錛?/p>
struct msgbuf{ long mtype; char mtext[1]; };
mtype鎴愬憳浠h〃娑堟伅綾誨瀷錛屼粠娑堟伅闃熷垪涓鍙栨秷鎭殑涓涓噸瑕佷緷鎹氨鏄秷鎭殑綾誨瀷錛沵text鏄秷鎭唴瀹癸紝褰撶劧闀垮害涓嶄竴瀹氫負(fù)1銆傚洜姝わ紝瀵逛簬鍙戦佹秷鎭?
鏉ヨ錛岄鍏堥緗竴涓猰sgbuf緙撳啿鍖哄茍鍐欏叆娑堟伅綾誨瀷鍜屽唴瀹癸紝璋冪敤鐩稿簲鐨勫彂閫佸嚱鏁板嵆鍙紱瀵硅鍙栨秷鎭潵璇達(dá)紝棣栧厛鍒嗛厤榪欐牱涓涓猰sgbuf緙撳啿鍖猴紝鐒跺悗鎶婃秷鎭?
璇誨叆璇ョ紦鍐插尯鍗沖彲銆?/p>
3銆?鑾峰緱鎴栬緗秷鎭槦鍒楀睘鎬э細(xì)
娑堟伅闃熷垪鐨勪俊鎭熀鏈笂閮戒繚瀛樺湪娑堟伅闃熷垪澶翠腑錛屽洜姝わ紝鍙互鍒嗛厤涓涓被浼間簬娑堟伅闃熷垪澶寸殑緇撴瀯(struct msqid_ds錛岃闄勫綍 2 )錛屾潵榪斿洖娑堟伅闃熷垪鐨勫睘鎬э紱鍚屾牱鍙互璁劇疆璇ユ暟鎹粨鏋勩?/p>
娑堟伅闃熷垪API
1銆佹枃浠跺悕鍒伴敭鍊?/strong>
#include <sys/types.h> #include <sys/ipc.h> key_t ftok (char*pathname, char proj)錛?br>
瀹冭繑鍥炰笌璺緞pathname鐩稿搴旂殑涓涓敭鍊箋傝鍑芥暟涓嶇洿鎺ュ娑堟伅闃熷垪鎿嶄綔錛屼絾鍦ㄨ皟鐢╥pc(MSGGET,…)鎴杕sgget()鏉ヨ幏寰楁秷鎭槦鍒楁弿榪板瓧鍓嶏紝寰寰瑕佽皟鐢ㄨ鍑芥暟銆傚吀鍨嬬殑璋冪敤浠g爜鏄細(xì)
key=ftok(path_ptr, 'a'); ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0); …
2銆乴inux涓烘搷浣滅郴緇烿榪涚▼闂撮氫俊鐨勪笁縐嶆柟寮忥紙娑堟伅闃熷垪銆佷俊鍙風(fēng)伅銆佸叡浜唴瀛樺尯錛夋彁渚涗簡(jiǎn)涓涓粺涓鐨勭敤鎴風(fēng)晫闈細(xì)
int ipc (MSGGET, int first, int second, int third, void *ptr, long fifth); 涓庤鎿嶄綔瀵瑰簲鐨勭郴緇烿璋冪敤涓猴細(xì)int msgget( (key_t)first錛宻econd)銆?
int ipc (MSGCTL, int first, int second, int third, void *ptr, long fifth) 涓庤鎿嶄綔瀵瑰簲鐨勭郴緇烿璋冪敤涓猴細(xì)int msgctl( first錛宻econd, (struct msqid_ds*) ptr)銆?
int ipc (MSGSND, int first, int second, int third, void *ptr, long fifth); 涓庤鎿嶄綔瀵瑰簲鐨勭郴緇烿璋冪敤涓猴細(xì)int msgsnd( first, (struct msgbuf*)ptr, second, third)銆?
int ipc (MSGRCV, int first, int second, int third, void *ptr, long fifth); 涓庤鎿嶄綔瀵瑰簲鐨勭郴緇烿璋冪敤涓猴細(xì)int msgrcv( first錛?struct msgbuf*)ptr, second, fifth,third)錛?
娉細(xì)鏈漢涓嶄富寮犻噰鐢ㄧ郴緇熻皟鐢╥pc()錛岃屾洿鍊懼悜浜庨噰鐢ㄧ郴緇烿鎴栬匬OSIX榪涚▼闂撮氫俊API銆傚師鍥犲涓嬶細(xì)
铏界劧璇ョ郴緇熻皟鐢ㄦ彁渚涗簡(jiǎn)緇熶竴鐨勭敤鎴風(fēng)晫闈紝浣嗘鏄敱浜庤繖涓壒鎬э紝瀹冪殑鍙傛暟鍑犱箮涓嶈兘緇欏嚭鐗瑰畾鐨勫疄闄呮剰涔夛紙濡備互first銆乻econd鏉ュ懡鍚嶅弬鏁幫級(jí)錛屽湪涓瀹氱▼搴︿笂閫犳垚寮鍙戜笉渚褲?
姝eipc鎵嬪唽鎵璇寸殑錛歩pc()鏄痩inux鎵鐗規(guī)湁鐨勶紝緙栧啓紼嬪簭鏃跺簲娉ㄦ剰紼嬪簭鐨勭Щ妞嶆ч棶棰橈紱
璇ョ郴緇熻皟鐢ㄧ殑瀹炵幇涓嶈繃鏄妸緋葷粺V IPC鍑芥暟榪涜浜?jiǎn)灏佽锛屾病鏈変恢M綍鏁堢巼涓婄殑浼樺娍錛?
緋葷粺V鍦↖PC鏂歸潰鐨凙PI鏁伴噺涓嶅錛屽艦寮忎篃杈冪畝媧併?
3.緋葷粺V娑堟伅闃熷垪API 緋葷粺V娑堟伅闃熷垪API鍏辨湁鍥涗釜錛屼嬌鐢ㄦ椂闇瑕佸寘鎷嚑涓ご鏂囦歡錛?/p>
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
1錛塱nt msgget(key_t key, int msgflg)
鍙傛暟key鏄竴涓敭鍊鹼紝鐢眆tok鑾峰緱錛沵sgflg鍙傛暟鏄竴浜涙爣蹇椾綅銆傝璋冪敤榪斿洖涓庡仴鍊糼ey鐩稿搴旂殑娑堟伅闃熷垪鎻忚堪瀛椼?/p>
鍦ㄤ互涓嬩袱縐嶆儏鍐典笅錛岃璋冪敤灝嗗垱寤轟竴涓柊鐨勬秷鎭槦鍒楋細(xì)
濡傛灉娌℃湁娑堟伅闃熷垪涓庡仴鍊糼ey鐩稿搴旓紝騫朵笖msgflg涓寘鍚簡(jiǎn)IPC_CREAT鏍囧織浣嶏紱
key鍙傛暟涓篒PC_PRIVATE錛?
鍙傛暟msgflg鍙互涓轟互涓嬶細(xì)IPC_CREAT銆両PC_EXCL銆両PC_NOWAIT鎴栦笁鑰呯殑鎴栫粨鏋溿?/p>
璋冪敤榪斿洖錛?/strong>鎴愬姛榪斿洖娑堟伅闃熷垪鎻忚堪瀛楋紝鍚﹀垯榪斿洖-1銆?/p>
娉細(xì)鍙傛暟key璁劇疆鎴愬父鏁癐PC_PRIVATE騫朵笉鎰忓懗鐫鍏朵粬榪涚▼涓嶈兘璁塊棶璇ユ秷鎭槦鍒楋紝鍙剰鍛崇潃鍗沖皢鍒涘緩鏂扮殑娑堟伅闃熷垪銆?/p>
2錛塱nt msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg); 璇ョ郴緇熻皟鐢ㄤ粠msgid浠h〃鐨勬秷鎭槦鍒椾腑璇誨彇涓涓秷鎭紝騫舵妸娑堟伅瀛樺偍鍦╩sgp鎸囧悜鐨刴sgbuf緇撴瀯涓?/p>
msqid涓烘秷鎭槦鍒楁弿榪板瓧錛涙秷鎭繑鍥炲悗瀛樺偍鍦╩sgp鎸囧悜鐨勫湴鍧錛宮sgsz鎸囧畾msgbuf鐨刴text鎴愬憳鐨勯暱搴︼紙鍗蟲秷鎭唴瀹圭殑闀垮害錛夛紝msgtyp涓鴻姹傝鍙栫殑娑堟伅綾誨瀷錛涜娑堟伅鏍囧織msgflg鍙互涓轟互涓嬪嚑涓父鍊肩殑鎴栵細(xì)
IPC_NOWAIT 濡傛灉娌℃湁婊¤凍鏉′歡鐨勬秷鎭紝璋冪敤绔嬪嵆榪斿洖錛屾鏃訛紝errno=ENOMSG
IPC_EXCEPT 涓巑sgtyp>0閰嶅悎浣跨敤錛岃繑鍥為槦鍒椾腑絎竴涓被鍨嬩笉涓簃sgtyp鐨勬秷鎭?
IPC_NOERROR 濡傛灉闃熷垪涓弧瓚蟲潯浠剁殑娑堟伅鍐呭澶т簬鎵璇鋒眰鐨刴sgsz瀛楄妭錛屽垯鎶婅娑堟伅鎴柇錛屾埅鏂儴鍒嗗皢涓㈠け銆?
msgrcv鎵嬪唽涓緇嗙粰鍑轟簡(jiǎn)娑堟伅綾誨瀷鍙栦笉鍚屽兼椂(>0; <0; =0)錛岃皟鐢ㄥ皢榪斿洖娑堟伅闃熷垪涓殑鍝釜娑堟伅銆?/p>
msgrcv()瑙i櫎闃誨鐨勬潯浠舵湁涓変釜錛?/p>
娑堟伅闃熷垪涓湁浜?jiǎn)婊…懴x潯浠剁殑娑堟伅錛?
msqid浠h〃鐨勬秷鎭槦鍒楄鍒犻櫎錛?
璋冪敤msgrcv錛堬級(jí)鐨勮繘紼嬭淇″彿涓柇錛?
璋冪敤榪斿洖錛?/strong>鎴愬姛榪斿洖璇誨嚭娑堟伅鐨勫疄闄呭瓧鑺傛暟錛屽惁鍒欒繑鍥?1銆?/p>
3錛塱nt msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg); 鍚憁sgid浠h〃鐨勬秷鎭槦鍒楀彂閫佷竴涓秷鎭紝鍗沖皢鍙戦佺殑娑堟伅瀛樺偍鍦╩sgp鎸囧悜鐨刴sgbuf緇撴瀯涓紝娑堟伅鐨勫ぇ灝忕敱msgze鎸囧畾銆?/p>
瀵瑰彂閫佹秷鎭潵璇達(dá)紝鏈夋剰涔夌殑msgflg鏍囧織涓篒PC_NOWAIT錛屾寚鏄庡湪娑堟伅闃熷垪娌℃湁瓚沖絀洪棿瀹圭撼瑕佸彂閫佺殑娑堟伅鏃訛紝msgsnd鏄惁絳夊緟銆傞犳垚msgsnd()絳夊緟鐨勬潯浠舵湁涓ょ錛?/p>
褰撳墠娑堟伅鐨勫ぇ灝忎笌褰撳墠娑堟伅闃熷垪涓殑瀛楄妭鏁頒箣鍜岃秴榪囦簡(jiǎn)娑堟伅闃熷垪鐨勬誨閲忥紱
褰撳墠娑堟伅闃熷垪鐨勬秷鎭暟錛堝崟浣?涓?錛変笉灝忎簬娑堟伅闃熷垪鐨勬誨閲忥紙鍗曚綅"瀛楄妭鏁?錛夛紝姝ゆ椂錛岃櫧鐒舵秷鎭槦鍒椾腑鐨勬秷鎭暟鐩緢澶氾紝浣嗗熀鏈笂閮藉彧鏈変竴涓瓧鑺傘?
msgsnd()瑙i櫎闃誨鐨勬潯浠舵湁涓変釜錛?
涓嶆弧瓚充笂榪頒袱涓潯浠訛紝鍗蟲秷鎭槦鍒椾腑鏈夊綰寵娑堟伅鐨勭┖闂達(dá)紱
msqid浠h〃鐨勬秷鎭槦鍒楄鍒犻櫎錛?
璋冪敤msgsnd錛堬級(jí)鐨勮繘紼嬭淇″彿涓柇錛?
璋冪敤榪斿洖錛?/strong>鎴愬姛榪斿洖0錛屽惁鍒欒繑鍥?1銆?/p>
4錛塱nt msgctl(int msqid, int cmd, struct msqid_ds *buf); 璇ョ郴緇熻皟鐢ㄥ鐢眒sqid鏍囪瘑鐨勬秷鎭槦鍒楁墽琛宑md鎿嶄綔錛屽叡鏈変笁縐峜md鎿嶄綔錛欼PC_STAT銆両PC_SET 銆両PC_RMID銆?/p>
IPC_STAT錛氳鍛戒護(hù)鐢ㄦ潵鑾峰彇娑堟伅闃熷垪淇℃伅錛岃繑鍥炵殑淇℃伅瀛樿串鍦╞uf鎸囧悜鐨刴sqid緇撴瀯涓紱
IPC_SET錛氳鍛戒護(hù)鐢ㄦ潵璁劇疆娑堟伅闃熷垪鐨勫睘鎬э紝瑕佽緗殑灞炴у瓨鍌ㄥ湪buf鎸囧悜鐨刴sqid緇撴瀯涓紱鍙緗睘鎬у寘鎷細(xì)msg_perm.uid銆乵sg_perm.gid銆乵sg_perm.mode浠ュ強(qiáng)msg_qbytes錛屽悓鏃訛紝涔熷獎(jiǎng)鍝峬sg_ctime鎴愬憳銆?
IPC_RMID錛氬垹闄sqid鏍囪瘑鐨勬秷鎭槦鍒楋紱
璋冪敤榪斿洖錛?/strong>鎴愬姛榪斿洖0錛屽惁鍒欒繑鍥?1銆?/p>
涓夈佹秷鎭槦鍒楃殑闄愬埗 姣忎釜娑堟伅闃熷垪鐨勫閲忥紙鎵鑳藉綰崇殑瀛楄妭鏁幫級(jí)閮芥湁闄愬埗錛岃鍊煎洜緋葷粺涓嶅悓鑰屼笉鍚屻傚湪鍚庨潰鐨勫簲鐢ㄥ疄渚嬩腑錛岃緭鍑轟簡(jiǎn)redhat 8.0鐨勯檺鍒訛紝緇撴灉鍙傝闄勫綍 3 銆?/p>
鍙︿竴涓檺鍒舵槸姣忎釜娑堟伅闃熷垪鎵鑳藉綰崇殑鏈澶ф秷鎭暟錛氬湪redhad 8.0涓紝璇ラ檺鍒舵槸鍙楁秷鎭槦鍒楀閲忓埗綰︾殑錛氭秷鎭釜鏁拌灝忎簬娑堟伅闃熷垪鐨勫閲忥紙瀛楄妭鏁幫級(jí)銆?/p>
娉細(xì)涓婅堪涓や釜闄愬埗鏄拡瀵規(guī)瘡涓秷鎭槦鍒楄岃█鐨勶紝緋葷粺瀵規(guī)秷鎭槦鍒楃殑闄愬埗榪樻湁緋葷粺鑼冨洿鍐呯殑鏈澶ф秷鎭槦鍒椾釜鏁幫紝浠ュ強(qiáng)鏁翠釜緋葷粺鑼冨洿鍐呯殑鏈澶ф秷鎭暟銆備竴鑸潵璇達(dá)紝瀹為檯寮鍙戣繃紼嬩腑涓嶄細(xì)瓚呰繃榪欎釜闄愬埗銆?/p>
鍥涖佹秷鎭槦鍒楀簲鐢ㄥ疄渚?/font> 娑堟伅闃熷垪搴旂敤鐩稿杈冪畝鍗曪紝涓嬮潰瀹炰緥鍩烘湰涓婅鐩栦簡(jiǎn)瀵規(guī)秷鎭槦鍒楃殑鎵鏈夋搷浣滐紝鍚屾椂錛岀▼搴忚緭鍑虹粨鏋滄湁鍔╀簬鍔犳繁瀵瑰墠闈㈡墍璁茬殑鏌愪簺瑙勫垯鍙?qiáng)娑堟伅闃熷垪闄愬埗鐨勭悊瑙c?/p>
#include <sys/types.h> #include <sys/msg.h> #include <unistd.h> void msg_stat(int,struct msqid_ds ); main() { int gflags,sflags,rflags; key_t key; int msgid; int reval; struct msgsbuf{ int mtype; char mtext[1]; }msg_sbuf; struct msgmbuf { int mtype; char mtext[10]; }msg_rbuf; struct msqid_ds msg_ginfo,msg_sinfo; char* msgpath="/unix/msgqueue"; key=ftok(msgpath,'a'); gflags=IPC_CREAT|IPC_EXCL; msgid=msgget(key,gflags|00666); if(msgid==-1) { printf("msg create error\n"); return; } //鍒涘緩涓涓秷鎭槦鍒楀悗錛岃緭鍑烘秷鎭槦鍒楃己鐪佸睘鎬?br>msg_stat(msgid,msg_ginfo); sflags=IPC_NOWAIT; msg_sbuf.mtype=10; msg_sbuf.mtext[0]='a'; reval=msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags); if(reval==-1) { printf("message send error\n"); } //鍙戦佷竴涓秷鎭悗錛岃緭鍑烘秷鎭槦鍒楀睘鎬?br>msg_stat(msgid,msg_ginfo); rflags=IPC_NOWAIT|MSG_NOERROR; reval=msgrcv(msgid,&msg_rbuf,4,10,rflags); if(reval==-1) printf("read msg error\n"); else printf("read from msg queue %d bytes\n",reval); //浠庢秷鎭槦鍒椾腑璇誨嚭娑堟伅鍚庯紝杈撳嚭娑堟伅闃熷垪灞炴?br>msg_stat(msgid,msg_ginfo); msg_sinfo.msg_perm.uid=8;//just a try msg_sinfo.msg_perm.gid=8;// msg_sinfo.msg_qbytes=16388; //姝ゅ楠岃瘉瓚呯駭鐢ㄦ埛鍙互鏇存敼娑堟伅闃熷垪鐨勭己鐪乵sg_qbytes //娉ㄦ剰榪欓噷璁劇疆鐨勫煎ぇ浜庣己鐪佸?br>reval=msgctl(msgid,IPC_SET,&msg_sinfo); if(reval==-1) { printf("msg set info error\n"); return; } msg_stat(msgid,msg_ginfo); //楠岃瘉璁劇疆娑堟伅闃熷垪灞炴?br>reval=msgctl(msgid,IPC_RMID,NULL);//鍒犻櫎娑堟伅闃熷垪 if(reval==-1) { printf("unlink msg queue error\n"); return; } } void msg_stat(int msgid,struct msqid_ds msg_info) { int reval; sleep(1);//鍙槸涓轟簡(jiǎn)鍚庨潰杈撳嚭鏃墮棿鐨勬柟渚?br>reval=msgctl(msgid,IPC_STAT,&msg_info); if(reval==-1) { printf("get msg info error\n"); return; } printf("\n"); printf("current number of bytes on queue is %d\n",msg_info.msg_cbytes); printf("number of messages in queue is %d\n",msg_info.msg_qnum); printf("max number of bytes on queue is %d\n",msg_info.msg_qbytes); //姣忎釜娑堟伅闃熷垪鐨勫閲忥紙瀛楄妭鏁幫級(jí)閮芥湁闄愬埗MSGMNB錛屽肩殑澶у皬鍥犵郴緇熻屽紓銆傚湪鍒涘緩鏂扮殑娑堟伅闃熷垪鏃訛紝//msg_qbytes鐨勭己鐪佸煎氨鏄疢SGMNB printf("pid of last msgsnd is %d\n",msg_info.msg_lspid); printf("pid of last msgrcv is %d\n",msg_info.msg_lrpid); printf("last msgsnd time is %s", ctime(&(msg_info.msg_stime))); printf("last msgrcv time is %s", ctime(&(msg_info.msg_rtime))); printf("last change time is %s", ctime(&(msg_info.msg_ctime))); printf("msg uid is %d\n",msg_info.msg_perm.uid); printf("msg gid is %d\n",msg_info.msg_perm.gid); }
紼嬪簭杈撳嚭緇撴灉瑙?font color="#003399">闄勫綍 3
銆?br>
灝忕粨錛?/font> 娑堟伅闃熷垪
涓庣閬撲互鍙?qiáng)鏈夊悕绠¢亾鐩告瘮锛屽呬h湁鏇村ぇ鐨勭伒媧繪э紝棣栧厛錛屽畠鎻愪緵鏈夋牸寮忓瓧鑺傛祦錛屾湁鍒╀簬鍑忓皯寮鍙戜漢鍛樼殑宸ヤ綔閲忥紱鍏舵錛屾秷鎭叿鏈夌被鍨嬶紝鍦ㄥ疄闄呭簲鐢ㄤ腑錛屽彲浣滀負(fù)浼樺厛綰т嬌
鐢ㄣ傝繖涓ょ偣鏄閬撲互鍙?qiáng)鏈夊悕绠¢亾鎵涓嶈兘姣旂殑銆傚悓鏍鳳紝娑堟伅闃熷垪鍙互鍦ㄥ嚑涓繘紼嬮棿澶嶇敤錛岃屼笉綆¤繖鍑犱釜榪涚▼鏄惁鍏鋒湁浜茬紭鍏崇郴錛岃繖涓鐐逛笌鏈夊悕綆¢亾寰堢浉浼鹼紱浣嗘秷鎭槦鍒?
鏄殢鍐呮牳鎸佺畫鐨勶紝涓庢湁鍚嶇閬擄紙闅忚繘紼嬫寔緇級(jí)鐩告瘮錛岀敓鍛藉姏鏇村己錛屽簲鐢ㄧ┖闂存洿澶с?/p>
闄勫綍 1 錛?/strong>鍦ㄥ弬鑰冩枃鐚甗1]涓紝緇欏嚭浜?jiǎn)IPC闅忚繘紼嬫寔緇侀殢鍐呮牳鎸佺畫浠ュ強(qiáng)闅忔枃浠剁郴緇熸寔緇殑瀹氫箟錛?/p>
闅忚繘紼嬫寔緇細(xì)IPC涓鐩村瓨鍦ㄥ埌鎵撳紑IPC瀵硅薄鐨勬渶鍚庝竴涓繘紼嬪叧闂瀵硅薄涓烘銆傚綆¢亾鍜屾湁鍚嶇閬擄紱
闅忓唴鏍告寔緇細(xì)IPC涓鐩存寔緇埌鍐呮牳閲嶆柊鑷婦鎴栬呮樉紺哄垹闄よ瀵硅薄涓烘銆傚娑堟伅闃熷垪銆佷俊鍙風(fēng)伅浠ュ強(qiáng)鍏變韓鍐呭瓨絳夛紱
闅忔枃浠剁郴緇熸寔緇細(xì)IPC涓鐩存寔緇埌鏄劇ず鍒犻櫎璇ュ璞′負(fù)姝€?
闄勫綍 2 錛?/strong> 緇撴瀯msg_queue鐢ㄦ潵鎻忚堪娑堟伅闃熷垪澶達(dá)紝瀛樺湪浜庣郴緇熺┖闂達(dá)細(xì)
struct msg_queue { struct kern_ipc_perm q_perm; time_t q_stime; /* last msgsnd time */ time_t q_rtime; /* last msgrcv time */ time_t q_ctime; /* last change time */ unsigned long q_cbytes; /* current number of bytes on queue */ unsigned long q_qnum; /* number of messages in queue */ unsigned long q_qbytes; /* max number of bytes on queue */ pid_t q_lspid; /* pid of last msgsnd */ pid_t q_lrpid; /* last receive pid */ struct list_head q_messages; struct list_head q_receivers; struct list_head q_senders; };
緇撴瀯msqid_ds鐢ㄦ潵璁劇疆鎴栬繑鍥炴秷鎭槦鍒楃殑淇℃伅錛屽瓨鍦ㄤ簬鐢ㄦ埛絀洪棿錛?/p>
struct msqid_ds { struct ipc_perm msg_perm; struct msg *msg_first; /* first message on queue,unused */ struct msg *msg_last; /* last message in queue,unused */ __kernel_time_t msg_stime; /* last msgsnd time */ __kernel_time_t msg_rtime; /* last msgrcv time */ __kernel_time_t msg_ctime; /* last change time */ unsigned long msg_lcbytes; /* Reuse junk fields for 32 bit */ unsigned long msg_lqbytes; /* ditto */ unsigned short msg_cbytes; /* current number of bytes on queue */ unsigned short msg_qnum; /* number of messages in queue */ unsigned short msg_qbytes; /* max number of bytes on queue */ __kernel_ipc_pid_t msg_lspid; /* pid of last msgsnd */ __kernel_ipc_pid_t msg_lrpid; /* last receive pid */ };
//鍙互鐪嬪嚭涓婅堪涓や釜緇撴瀯寰堢浉浼箋?br>
闄勫綍 3 錛?/strong>娑堟伅闃熷垪瀹炰緥杈撳嚭緇撴灉錛?/p>
current number of bytes on queue is 0 number of messages in queue is 0 max number of bytes on queue is 16384 pid of last msgsnd is 0 pid of last msgrcv is 0 last msgsnd time is Thu Jan 1 08:00:00 1970 last msgrcv time is Thu Jan 1 08:00:00 1970 last change time is Sun Dec 29 18:28:20 2002 msg uid is 0 msg gid is 0 //涓婇潰鍒氬垰鍒涘緩涓涓柊娑堟伅闃熷垪鏃剁殑杈撳嚭 current number of bytes on queue is 1 number of messages in queue is 1 max number of bytes on queue is 16384 pid of last msgsnd is 2510 pid of last msgrcv is 0 last msgsnd time is Sun Dec 29 18:28:21 2002 last msgrcv time is Thu Jan 1 08:00:00 1970 last change time is Sun Dec 29 18:28:20 2002 msg uid is 0 msg gid is 0 read from msg queue 1 bytes //瀹為檯璇誨嚭鐨勫瓧鑺傛暟 current number of bytes on queue is 0 number of messages in queue is 0 max number of bytes on queue is 16384 //姣忎釜娑堟伅闃熷垪鏈澶у閲忥紙瀛楄妭鏁幫級(jí) pid of last msgsnd is 2510 pid of last msgrcv is 2510 last msgsnd time is Sun Dec 29 18:28:21 2002 last msgrcv time is Sun Dec 29 18:28:22 2002 last change time is Sun Dec 29 18:28:20 2002 msg uid is 0 msg gid is 0 current number of bytes on queue is 0 number of messages in queue is 0 max number of bytes on queue is 16388 //鍙湅鍑?guó)櫠吘Uх敤鎴峰彲淇敼娑堟伅闃熷垪鏈澶у閲?br>pid of last msgsnd is 2510 pid of last msgrcv is 2510 //瀵規(guī)搷浣滄秷鎭槦鍒楄繘紼嬬殑璺熻釜 last msgsnd time is Sun Dec 29 18:28:21 2002 last msgrcv time is Sun Dec 29 18:28:22 2002 last change time is Sun Dec 29 18:28:23 2002 //msgctl()璋冪敤瀵筸sg_ctime鏈夊獎(jiǎng)鍝?br>msg uid is 8 msg gid is 8
鍙傝冩枃鐚細(xì)
UNIX緗戠粶緙栫▼絎簩鍗鳳細(xì)榪涚▼闂撮氫俊錛屼綔鑰咃細(xì)W.Richard Stevens錛岃瘧鑰咃細(xì)鏉ㄧ戶寮狅紝娓呭崕澶у鍑虹増紺俱傚POSIX浠ュ強(qiáng)緋葷粺V娑堟伅闃熷垪閮芥湁闃愯堪錛屽Linux鐜涓嬬殑紼嬪簭寮鍙戞湁鏋佸ぇ鐨勫惎鍙戞剰涔夈?
linux鍐呮牳婧愪唬鐮佹儏鏅垎鏋愶紙涓婏級(jí)錛屾瘺寰鋒搷銆佽儭甯屾槑钁楋紝嫻欐睙澶у鍑虹増紺撅紝緇欏嚭浜?jiǎn)绯痪l烿娑堟伅闃熷垪鐩稿叧鐨勬簮浠g爜鍒嗘瀽銆?
http://www.fanqiang.com/a4/b2/20010508/113315.html 錛屼富瑕侀槓榪發(fā)inux涓嬪鏂囦歡鐨勬搷浣滐紝璇︾粏浠嬬粛浜?jiǎn)瀵规枃錃g鐨勫瓨鍙栨潈闄愪綅錛屽IPC瀵硅薄鐨勫瓨鍙栨潈闄愬悓鏍峰叿鏈夊緢濂界殑鍊熼壌鎰忎箟銆?
msgget銆乵sgsnd銆乵sgrcv銆乵sgctl鎵嬪唽
]]>
Linux涓嬪綰跨▼緙栫▼璇﹁В http://www.shnenglu.com/yehongly/archive/2008/10/13/63898.html鑼?/dc:creator>鑼?/author>Mon, 13 Oct 2008 07:35:00 GMT http://www.shnenglu.com/yehongly/archive/2008/10/13/63898.html http://www.shnenglu.com/yehongly/comments/63898.html http://www.shnenglu.com/yehongly/archive/2008/10/13/63898.html#Feedback 0 http://www.shnenglu.com/yehongly/comments/commentRss/63898.html http://www.shnenglu.com/yehongly/services/trackbacks/63898.html 綰跨▼錛坱hread錛夋妧鏈棭鍦?0騫翠唬灝辮鎻愬嚭錛屼絾鐪熸搴旂敤澶氱嚎紼嬪埌鎿嶄綔緋葷粺涓幓錛屾槸鍦?0騫翠唬涓湡錛宻olaris鏄繖鏂歸潰鐨勪郊浣艱呫備紶緇熺殑Unix涔熸敮鎸佺嚎紼嬬殑姒傚康錛屼絾鏄湪涓涓繘紼嬶紙process錛変腑鍙厑璁告湁涓涓嚎紼嬶紝榪欐牱澶氱嚎紼嬪氨鎰忓懗鐫澶氳繘紼嬨?br>鐜板湪錛屽綰跨▼鎶鏈凡緇忚璁稿鎿嶄綔緋葷粺鎵鏀寔錛屽寘鎷琖indows/NT錛屽綋鐒?dòng)灱屼篃鍖呮嫭Linux銆?br> 銆銆涓轟粈涔堟湁浜?jiǎn)杩浗E嬬殑姒傚康鍚庯紝榪樿鍐嶅紩鍏ョ嚎紼嬪憿錛熶嬌鐢ㄥ綰跨▼鍒板簳鏈夊摢浜涘ソ澶勶紵浠涔堢殑緋葷粺搴旇閫夌敤澶氱嚎紼嬶紵鎴戜滑棣栧厛蹇呴』鍥炵瓟榪欎簺闂銆?br>
浣跨敤澶氱嚎紼嬬殑鐞嗙敱涔嬩竴鏄拰榪涚▼鐩告瘮錛屽畠鏄竴縐嶉潪甯?鑺備凱"鐨勫浠誨姟鎿嶄綔鏂瑰紡銆傛垜浠煡閬擄紝鍦↙inux緋葷粺涓嬶紝鍚姩涓涓柊鐨勮繘紼嬪繀欏誨垎閰嶇粰瀹冪嫭绔嬬殑鍦板潃絀?
闂達(dá)紝寤虹珛浼楀鐨勬暟鎹〃鏉ョ淮鎶ゅ畠鐨勪唬鐮佹銆佸爢鏍堟鍜屾暟鎹錛岃繖鏄竴縐?鏄傝吹"鐨勫浠誨姟宸ヤ綔鏂瑰紡銆傝岃繍琛屼簬涓涓繘紼嬩腑鐨勫涓嚎紼嬶紝瀹冧滑褰兼涔嬮棿浣跨敤鐩稿悓鐨勫湴鍧
絀洪棿錛屽叡浜ぇ閮ㄥ垎鏁版嵁錛屽惎鍔ㄤ竴涓嚎紼嬫墍鑺辮垂鐨勭┖闂磋繙榪滃皬浜庡惎鍔ㄤ竴涓繘紼嬫墍鑺辮垂鐨勭┖闂達(dá)紝鑰屼笖錛岀嚎紼嬮棿褰兼鍒囨崲鎵闇鐨勬椂闂翠篃榪滆繙灝忎簬榪涚▼闂村垏鎹㈡墍闇瑕佺殑鏃墮棿銆?
鎹粺璁★紝鎬葷殑璇存潵錛屼竴涓繘紼嬬殑寮閿澶х害鏄竴涓嚎紼嬪紑閿鐨?0鍊嶅乏鍙籌紝褰撶劧錛屽湪鍏蜂綋鐨勭郴緇熶笂錛岃繖涓暟鎹彲鑳戒細(xì)鏈夎緝澶х殑鍖哄埆銆?br> 銆銆浣跨敤澶氱嚎紼?
鐨勭悊鐢變箣浜屾槸綰跨▼闂存柟渚跨殑閫氫俊鏈哄埗銆傚涓嶅悓榪涚▼鏉ヨ錛屽畠浠叿鏈夌嫭绔嬬殑鏁版嵁絀洪棿錛岃榪涜鏁版嵁鐨勪紶閫掑彧鑳介氳繃閫氫俊鐨勬柟寮忚繘琛岋紝榪欑鏂瑰紡涓嶄粎璐規(guī)椂錛岃屼笖寰堜笉鏂?
渚褲傜嚎紼嬪垯涓嶇劧錛岀敱浜庡悓涓榪涚▼涓嬬殑綰跨▼涔嬮棿鍏變韓鏁版嵁絀洪棿錛屾墍浠ヤ竴涓嚎紼嬬殑鏁版嵁鍙互鐩存帴涓哄叾瀹冪嚎紼嬫墍鐢紝榪欎笉浠呭揩鎹鳳紝鑰屼笖鏂逛究銆傚綋鐒?dòng)灱屾暟鎹殑鍏变韩涔熷甫鏉ュ叾浠?
涓浜涢棶棰橈紝鏈夌殑鍙橀噺涓嶈兘鍚屾椂琚袱涓嚎紼嬫墍淇敼錛屾湁鐨勫瓙紼嬪簭涓0鏄庝負(fù)static鐨勬暟鎹洿鏈夊彲鑳界粰澶氱嚎紼嬬▼搴忓甫鏉ョ伨闅炬х殑鎵撳嚮錛岃繖浜涙鏄紪鍐欏綰跨▼紼嬪簭鏃舵渶
闇瑕佹敞鎰忕殑鍦版柟銆?br> 銆銆闄や簡(jiǎn)浠ヤ笂鎵璇寸殑浼樼偣澶栵紝涓嶅拰榪涚▼姣旇緝錛屽綰跨▼紼嬪簭浣滀負(fù)涓縐嶅浠誨姟銆佸茍鍙戠殑宸ヤ綔鏂瑰紡錛屽綋鐒舵湁浠ヤ笅鐨勪紭鐐癸細(xì) 銆銆1) 鎻愰珮搴旂敤紼嬪簭鍝嶅簲銆傝繖瀵瑰浘褰㈢晫闈㈢殑紼嬪簭灝ゅ叾鏈夋剰涔夛紝褰撲竴涓搷浣滆楁椂寰堥暱鏃訛紝鏁翠釜緋葷粺閮戒細(xì)絳夊緟榪欎釜鎿嶄綔錛屾鏃剁▼搴忎笉浼?xì)鍝嶅簲閿洏銆侀紶鏍囥佽彍鍗曠殑鎿嶄綔錛岃屼嬌鐢ㄥ綰跨▼鎶鏈紝灝嗚楁椂闀跨殑鎿嶄綔錛坱ime consuming錛夌疆浜庝竴涓柊鐨勭嚎紼嬶紝鍙互閬垮厤榪欑灝村艾鐨勬儏鍐點(diǎn)?br> 銆銆2) 浣垮CPU緋葷粺鏇村姞鏈夋晥銆傛搷浣滅郴緇熶細(xì)淇濊瘉褰撶嚎紼嬫暟涓嶅ぇ浜嶤PU鏁扮洰鏃訛紝涓嶅悓鐨勭嚎紼嬭繍琛屼簬涓嶅悓鐨凜PU涓娿?br> 銆銆3) 鏀瑰杽紼嬪簭緇撴瀯銆備竴涓棦闀垮張澶嶆潅鐨勮繘紼嬪彲浠ヨ冭檻鍒嗕負(fù)澶氫釜綰跨▼錛屾垚涓哄嚑涓嫭绔嬫垨鍗婄嫭绔嬬殑榪愯閮ㄥ垎錛岃繖鏍風(fēng)殑紼嬪簭浼?xì)鍒╀簬鐞嗚В鍜屼慨鏀广?br> 銆銆涓嬮潰鎴戜滑鍏堟潵灝濊瘯緙栧啓涓涓畝鍗曠殑澶氱嚎紼嬬▼搴忋?br> 銆銆綆鍗曠殑澶氱嚎紼嬬紪紼?br>
Linux緋葷粺涓嬬殑澶氱嚎紼嬮伒寰狿OSIX綰跨▼鎺ュ彛錛岀О涓簆thread銆傜紪鍐橪inux涓嬬殑澶氱嚎紼嬬▼搴忥紝闇瑕佷嬌鐢ㄥご鏂囦歡pthread.h錛岃繛鎺ユ椂闇瑕?
浣跨敤搴搇ibpthread.a銆傞『渚胯涓涓嬶紝Linux涓媝thread鐨勫疄鐜版槸閫氳繃緋葷粺璋冪敤clone錛堬級(jí)鏉ュ疄鐜扮殑銆俢lone錛堬級(jí)鏄疞inux鎵鐗?
鏈夌殑緋葷粺璋冪敤錛屽畠鐨勪嬌鐢ㄦ柟寮忕被浼糵ork錛屽叧浜巆lone錛堬級(jí)鐨勮緇嗘儏鍐碉紝鏈夊叴瓚g殑璇昏呭彲浠ュ幓鏌ョ湅鏈夊叧鏂囨。璇存槑銆備笅闈㈡垜浠睍紺轟竴涓渶綆鍗曠殑澶氱嚎紼嬬▼搴?
pthread_create.c銆?br> 涓涓噸瑕佺殑綰跨▼鍒涘緩鍑芥暟鍘熷瀷錛?br>#include <pthread.h> int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, void *(*start_rtn)(void),void *restrict arg); 榪斿洖鍊鹼細(xì)鑻ユ槸鎴愬姛寤虹珛綰跨▼榪斿洖0,鍚﹀垯榪斿洖閿欒鐨勭紪鍙?br> 褰㈠紡鍙傛暟錛?br> pthread_t *restrict tidp 瑕佸垱寤虹殑綰跨▼鐨勭嚎紼媔d鎸囬拡 const pthread_attr_t *restrict attr 鍒涘緩綰跨▼鏃剁殑綰跨▼灞炴?br> void* (start_rtn)(void) 榪斿洖鍊兼槸void綾誨瀷鐨勬寚閽堝嚱鏁?br> void *restrict arg start_rtn鐨勮鍙?br> 渚嬬▼1錛?nbsp; 鍔熻兘錛氬垱寤轟竴涓畝鍗曠殑綰跨▼ 紼嬪簭鍚嶇О錛歱thread_create.c 銆銆 /******************************************************************************************** ** Name:pthread_create.c ** Used to study the multithread programming in Linux OS ** Author:zeickey ** Date:2006/9/16 ** Copyright (c) 2006,All Rights Reserved! *********************************************************************************************/ #include <stdio.h> #include <pthread.h> void *myThread1(void) { int i; for (i=0; i<100; i++) { printf("This is the 1st pthread,created by zieckey.\n"); sleep(1);//Let this thread to sleep 1 second,and then continue to run } } void *myThread2(void) { int i; for (i=0; i<100; i++) { printf("This is the 2st pthread,created by zieckey.\n"); sleep(1); } } int main() { int i=0, ret=0; pthread_t id1,id2; ret = pthread_create(&id2, NULL, (void*)myThread1, NULL); if (ret) { printf("Create pthread error!\n"); return 1; } ret = pthread_create(&id2, NULL, (void*)myThread2, NULL); if (ret) { printf("Create pthread error!\n"); return 1; } pthread_join(id1, NULL); pthread_join(id2, NULL); return 0; } 銆銆鎴戜滑緙栬瘧姝ょ▼搴忥細(xì) # gcc pthread_create.c -lpthread 鍥犱負(fù)pthread鐨勫簱涓嶆槸linux緋葷粺鐨勫簱錛屾墍浠ュ湪榪涜緙栬瘧鐨勬椂鍊欒鍔犱笂-lpthread錛屽惁鍒欑紪璇戜笉榪囷紝浼?xì)鍑虹庮C笅闈㈤敊璇?br>thread_test.c: 鍦ㄥ嚱鏁?‘create’ 涓細(xì) thread_test.c:7: 璀﹀憡錛?鍦ㄦ湁榪斿洖鍊肩殑鍑芥暟涓紝紼嬪簭嫻佺▼鍒拌揪鍑芥暟灝?br>/tmp/ccOBJmuD.o: In function `main':thread_test.c:(.text+0x4f)錛氬‘pthread_create’鏈畾涔夌殑寮曠敤 collect2: ld 榪斿洖 1 銆銆榪愯錛屾垜浠緱鍒板涓嬬粨鏋滐細(xì) # ./a.out This is the 1st pthread,created by zieckey. This is the 2st pthread,created by zieckey. This is the 1st pthread,created by zieckey. This is the 2st pthread,created by zieckey. This is the 2st pthread,created by zieckey. This is the 1st pthread,created by zieckey. .... 涓や釜綰跨▼浜ゆ浛鎵ц銆?br>姝や緥瀛愪粙緇嶄簡(jiǎn)鍒涘緩綰跨▼鐨勬柟娉曘?br>涓嬮潰渚嬪瓙浠嬬粛鍚戠嚎紼嬩紶閫掑弬鏁般?br> 渚嬬▼2錛?br> 鍔熻兘錛氬悜鏂扮殑綰跨▼浼犻掓暣褰㈠?br> 紼嬪簭鍚嶇О錛歱thread_int.c /******************************************************************************************** ** Name:pthread_int.c ** Used to study the multithread programming in Linux OS ** Pass a parameter to the thread. ** Author:zeickey ** Date:2006/9/16 ** Copyright (c) 2006,All Rights Reserved! *********************************************************************************************/ #include <stdio.h> #include <pthread.h> #include <unistd.h> void *create(void *arg) { int *num; num=(int *)arg; printf("create parameter is %d \n",*num); return (void *)0; } int main(int argc ,char *argv[]) { pthread_t tidp; int error; int test=4; int *attr=&test; error=pthread_create(&tidp,NULL,create,(void *)attr); if(error) { printf("pthread_create is created is not created ... \n"); return -1; } sleep(1); printf("pthread_create is created ...\n"); return 0; } 緙栬瘧鏂規(guī)硶錛?br> gcc -lpthread pthread_int.c -Wall 鎵ц緇撴灉錛?br> create parameter is 4 pthread_create is created is created ... 渚嬬▼鎬葷粨錛?br> 鍙互鐪嬪嚭鏉ワ紝鎴戜滑鍦╩ain鍑芥暟涓紶閫掔殑鏁磋鎸囬拡錛屼紶閫掑埌鎴戜滑鏂板緩鐨勭嚎紼嬪嚱鏁頒腑銆?br> 鍦ㄤ笂闈㈢殑渚嬪瓙鍙互鐪嬪嚭鏉ユ垜浠悜鏂扮殑綰跨▼浼犲叆浜?jiǎn)鍙︿竴涓嚎紼嬬殑int鏁版嵁錛岀嚎紼嬩箣闂磋繕鍙互浼犻掑瓧絎︿覆鎴栨槸鏇村鏉傜殑鏁版嵁緇撴瀯銆?br>渚嬬▼3錛?br> 紼嬪簭鍔熻兘錛氬悜鏂板緩鐨勭嚎紼嬩紶閫掑瓧絎︿覆 紼嬪簭鍚嶇О錛歱thread_string.c /******************************************************************************************** ** Name:pthread_string.c ** Used to study the multithread programming in Linux OS ** Pass a ‘char*‘ parameter to the thread. ** Author:zeickey ** Date:2006/9/16 ** Copyright (c) 2006,All Rights Reserved! *********************************************************************************************/ #include <pthread.h> #include <stdio.h> #include <unistd.h> void *create(void *arg) { char *name; name=(char *)arg; printf("The parameter passed from main function is %s \n",name); return (void *)0; } int main(int argc, char *argv[]) { char *a="zieckey"; int error; pthread_t tidp; error=pthread_create(&tidp, NULL, create, (void *)a); if(error!=0) { printf("pthread is not created.\n"); return -1; } sleep(1); printf("pthread is created... \n"); return 0; } 緙栬瘧鏂規(guī)硶錛?br> gcc -Wall pthread_string.c -lpthread 鎵ц緇撴灉錛?br>The parameter passed from main function is zieckey pthread is created... 渚嬬▼鎬葷粨錛?br> 鍙互鐪嬪嚭鏉ain鍑芥暟涓殑瀛楃涓蹭紶鍏ヤ簡(jiǎn)鏂板緩鐨勭嚎紼嬩腑銆?br> 渚嬬▼4錛?br> 紼嬪簭鍔熻兘錛氬悜鏂板緩鐨勭嚎紼嬩紶閫掑瓧絎︿覆 紼嬪簭鍚嶇О錛歱thread_struct.c /******************************************************************************************** ** Name:pthread_struct.c ** Used to study the multithread programming in Linux OS ** Pass a ‘char*‘ parameter to the thread. ** Author:zeickey ** Date:2006/9/16 ** Copyright (c) 2006,All Rights Reserved! *********************************************************************************************/ #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> struct menber { int a; char *s; }; void *create(void *arg) { struct menber *temp; temp=(struct menber *)arg; printf("menber->a = %d \n",temp->a); printf("menber->s = %s \n",temp->s); return (void *)0; } int main(int argc,char *argv[]) { pthread_t tidp; int error; struct menber *b; b=(struct menber *)malloc( sizeof(struct menber) ); b->a = 4; b->s = "zieckey"; error = pthread_create(&tidp, NULL, create, (void *)b); if( error ) { printf("phread is not created...\n"); return -1; } sleep(1); printf("pthread is created...\n"); return 0; } 緙栬瘧鏂規(guī)硶錛?br> gcc -Wall pthread_struct.c -lpthread 鎵ц緇撴灉錛?br>menber->a = 4 menber->s = zieckey pthread is created... 渚嬬▼鎬葷粨錛?br> 鍙互鐪嬪嚭鏉ain鍑芥暟涓殑涓涓粨鏋勪綋浼犲叆浜?jiǎn)鏂板缓鐨劸U跨▼涓?br> 綰跨▼鍖呭惈浜?jiǎn)鏍囪瘑杩浗E嬪唴鎵ц鐜蹇呴』鐨勪俊鎭備粬闆嗘垚浜?jiǎn)杩浗E嬩腑鐨勬墍鏈変俊鎭兘鏄綰跨▼榪涜鍏變韓鐨勶紝鍖呮嫭鏂囨湰紼嬪簭銆佺▼搴忕殑鍏ㄥ眬鍐呭瓨鍜屽爢鍐呭瓨銆佹爤浠ュ強(qiáng)鏂囦歡鎻忚堪絎︺?br> 渚嬬▼5錛?br> 紼嬪簭鐩殑錛氶獙璇佹柊寤虹珛鐨勭嚎紼嬪彲浠ュ叡浜繘紼嬩腑鐨勬暟鎹?br> 紼嬪簭鍚嶇О錛歱thread_share.c /******************************************************************************************** ** Name:pthread_share_data.c ** Used to study the multithread programming in Linux OS ** Pass a ‘char*‘ parameter to the thread. ** Author:zeickey ** Date:2006/9/16 ** Copyright (c) 2006,All Rights Reserved! *********************************************************************************************/ #include <stdio.h> #include <pthread.h> #include <unistd.h> static int a=4; void *create(void *arg) { printf("new pthread ... \n"); printf("a=%d \n",a); return (void *)0; } int main(int argc,char *argv[]) { pthread_t tidp; int error; a=5; error=pthread_create(&tidp, NULL, create, NULL); if(error!=0) { printf("new thread is not create ... \n"); return -1; } sleep(1); printf("new thread is created ... \n"); return 0; } 緙栬瘧鏂規(guī)硶錛?br> gcc -Wall pthread_share_data.c -lpthread 鎵ц緇撴灉錛?br>new pthread ... a=5 new thread is created ... 渚嬬▼鎬葷粨錛?br>鍙互鐪嬪嚭鏉ワ紝鎴戜滑鍦ㄤ富綰跨▼鏇存敼浜?jiǎn)鎴戜滑鐨勫叏灞鍙橀噺a鐨勫肩殑鏃跺欙紝鎴戜滑鏂板緩绔嬬殑綰跨▼鍒欐墦鍗板嚭鏉ヤ簡(jiǎn)鏀瑰彉鐨勫鹼紝鍙互鐪嬪嚭鍙互璁塊棶綰跨▼鎵鍦ㄨ繘紼嬩腑鐨勬暟鎹俊鎭?br>2銆佺嚎紼嬬殑緇堟 濡傛灉榪涚▼涓換浣曚竴涓嚎紼嬩腑璋冪敤exit錛宊Exit,鎴栬呮槸_exit錛岄偅涔堟暣涓繘紼嬪氨浼?xì)缁堟锛?br> 涓庢綾諱技錛屽鏋滀俊鍙風(fēng)殑榛樿鐨勫姩浣滄槸緇堟榪涚▼錛岄偅涔堬紝鎶婅淇″彿鍙戦佸埌綰跨▼浼?xì)缁堟杩浗E嬨?br> 綰跨▼鐨勬甯擱鍑虹殑鏂瑰紡錛?br> (1) 綰跨▼鍙槸浠庡惎鍔ㄤ緥紼嬩腑榪斿洖錛岃繑鍥炲兼槸綰跨▼涓殑閫鍑虹爜 (2) 綰跨▼鍙互琚彟涓涓繘紼嬭繘琛岀粓姝?br> (3) 綰跨▼鑷繁璋冪敤pthread_exit鍑芥暟 涓や釜閲嶈鐨勫嚱鏁板師鍨嬶細(xì) #include <pthread.h> void pthread_exit(void *rval_ptr); /*rval_ptr 綰跨▼閫鍑?guó)櫩斿洖鐨勬寚閽?/ int pthread_join(pthread_t thread,void **rval_ptr); /*鎴愬姛緇撴潫榪涚▼涓?,鍚﹀垯涓洪敊璇紪鐮?/ 渚嬬▼6 紼嬪簭鐩殑錛氱嚎紼嬫甯擱鍑猴紝鎺ュ彈綰跨▼閫鍑虹殑榪斿洖鐮?br> 紼嬪簭鍚嶇О錛歱thread_exit.c /******************************************************************************************** ** Name:pthread_exit.c ** Used to study the multithread programming in Linux OS ** A example showing a thread to exit and with a return code. ** Author:zeickey ** Date:2006/9/16 ** Copyright (c) 2006,All Rights Reserved! *********************************************************************************************/ #include <stdio.h> #include <pthread.h> #include <unistd.h> void *create(void *arg) { printf("new thread is created ... \n"); return (void *)8; } int main(int argc,char *argv[]) { pthread_t tid; int error; void *temp; error = pthread_create(&tid, NULL, create, NULL); if( error ) { printf("thread is not created ... \n"); return -1; } error = pthread_join(tid, &temp); if( error ) { printf("thread is not exit ... \n"); return -2; } printf("thread is exit code %d \n", (int )temp); return 0; } 緙栬瘧鏂規(guī)硶錛?br> gcc -Wall pthread_exit.c -lpthread 鎵ц緇撴灉錛?br>new thread is created ... thread is exit code 8 渚嬬▼鎬葷粨錛?br>鍙互鐪嬪嚭鏉ワ紝綰跨▼閫鍑哄彲浠ヨ繑鍥炵嚎紼嬬殑int鏁板箋傜嚎紼嬮鍑轟笉浠呬粎鍙互榪斿洖綰跨▼鐨刬nt鏁板鹼紝榪樺彲浠ヨ繑鍥炰竴涓鏉傜殑鏁版嵁緇撴瀯銆?br> 渚嬬▼7 紼嬪簭鐩殑錛氱嚎紼嬬粨鏉熻繑鍥炰竴涓鏉傜殑鏁版嵁緇撴瀯 紼嬪簭鍚嶇О錛歱thread_return_struct.c #include <stdio.h> #include <pthread.h> #include <unistd.h> struct menber { int a; char *b; }temp={8,"zieckey"}; void *create(void *arg) { printf("new thread ... \n"); return (void *)&temp; } int main(int argc,char *argv[]) { int error; pthread_t tid; struct menber *c; error = pthread_create(&tid, NULL, create, NULL); if( error ) { printf("new thread is not created ... \n"); return -1; } printf("main ... \n"); error = pthread_join(tid,(void *)&c); if( error ) { printf("new thread is not exit ... \n"); return -2; } printf("c->a = %d \n",c->a); printf("c->b = %s \n",c->b); sleep(1); return 0; } 緙栬瘧鏂規(guī)硶錛?br> gcc -Wall pthread_return_struct.c -lpthread 鎵ц緇撴灉錛?br> main ... new thread ... c->a = 8 c->b = zieckey 渚嬬▼鎬葷粨錛?br>涓瀹氳璁板緱榪斿洖鐨勬暟鎹粨鏋勮鏄湪榪欎釜鏁版嵁瑕佽繑鍥炵殑緇撴瀯娌℃湁閲婃斁鐨勬椂鍊欏簲鐢紝 濡傛灉鏁版嵁緇撴瀯宸茬粡鍙戠敓鍙樺寲錛岄偅榪斿洖鐨勫氨涓嶄細(xì)鏄垜浠墍闇瑕佺殑錛岃屾槸鑴忔暟鎹?br>3銆佺嚎紼嬫爣璇?br> 鍑芥暟鍘熷瀷錛?br> #include <pthread.h> pthread_t pthread_self(void); pid_t getpid(void); getpid()鐢ㄦ潵鍙栧緱鐩墠榪涚▼鐨勮繘紼嬭瘑鍒爜,鍑芥暟璇存槑 渚嬬▼8 紼嬪簭鐩殑錛氬疄鐜板湪鏂板緩绔嬬殑綰跨▼涓墦鍗拌綰跨▼鐨刬d鍜岃繘紼媔d 紼嬪簭鍚嶇О錛歱thread_id.c /******************************************************************************************** ** Name:pthread_id.c ** Used to study the multithread programming in Linux OS. ** Showing how to get the thread's tid and the process's pid. ** Author:zeickey ** Date:2006/9/16 ** Copyright (c) 2006,All Rights Reserved! *********************************************************************************************/ #include <stdio.h> #include <pthread.h> #include <unistd.h> /*getpid()*/ void *create(void *arg) { printf("New thread .... \n"); printf("This thread's id is %u \n", (unsigned int)pthread_self()); printf("The process pid is %d \n",getpid()); return (void *)0; } int main(int argc,char *argv[]) { pthread_t tid; int error; printf("Main thread is starting ... \n"); error = pthread_create(&tid, NULL, create, NULL); if(error) { printf("thread is not created ... \n"); return -1; } printf("The main process's pid is %d \n",getpid()); sleep(1); return 0; } 緙栬瘧鏂規(guī)硶錛?br> gcc -Wall -lpthread pthread_id.c 鎵ц緇撴灉錛?br> Main thread is starting ... The main process's pid is 3307 New thread .... This thread's id is 3086347152 The process pid is 3307 ]]> 瀛楄妭瀵歸綈璇﹁В http://www.shnenglu.com/yehongly/archive/2008/10/13/63857.html鑼?/dc:creator>鑼?/author>Mon, 13 Oct 2008 01:30:00 GMT http://www.shnenglu.com/yehongly/archive/2008/10/13/63857.html http://www.shnenglu.com/yehongly/comments/63857.html http://www.shnenglu.com/yehongly/archive/2008/10/13/63857.html#Feedback 0 http://www.shnenglu.com/yehongly/comments/commentRss/63857.html http://www.shnenglu.com/yehongly/services/trackbacks/63857.html 鍏跺疄瀛楄妭瀵歸綈鐨勭粏鑺傚拰鍏蜂綋緙栬瘧鍣ㄥ疄鐜扮浉鍏籌紝浣嗕竴鑸岃█錛屾弧瓚充笁涓噯鍒欙細(xì) 1) 緇撴瀯浣撳彉閲忕殑棣栧湴鍧鑳藉琚叾鏈瀹藉熀鏈被鍨嬫垚鍛樼殑澶у皬鎵鏁撮櫎錛?
2) 緇撴瀯浣撴瘡涓垚鍛樼浉瀵逛簬緇撴瀯浣撻鍦板潃鐨勫亸縐婚噺閮芥槸鎴愬憳澶у皬鐨勬暣鏁板嶏紝濡傛湁闇瑕佺紪璇戝櫒浼?xì)鍦ㄦ垚鍛樹箣闂村姞涓婂~鍏呭瓧鑺傚Q涗緥濡備笂闈㈢浜屼釜緇撴瀯浣撳彉閲忕殑鍦板潃絀洪棿銆?/p>
3) 緇撴瀯浣撶殑鎬誨ぇ灝忎負(fù)緇撴瀯浣撴渶瀹藉熀鏈被鍨嬫垚鍛樺ぇ灝忕殑鏁存暟鍊嶏紝濡傛湁闇瑕佺紪璇戝櫒浼?xì)鍦ㄦ渶鏈竴涓垚鍛樹箣鍚庡姞涓婂~鍏呭瓧鑺傘備緥濡備笂闈㈢涓涓粨鏋勪綋鍙橀噺銆?br>
涓.浠涔堟槸瀛楄妭瀵歸綈,涓轟粈涔堣瀵歸綈?
鐜頒唬璁$畻鏈轟腑鍐呭瓨絀洪棿閮芥槸鎸夌収byte鍒掑垎鐨勶紝浠庣悊璁轟笂璁蹭技涔庡浠諱綍綾誨瀷鐨勫彉閲忕殑璁塊棶鍙互浠庝換浣曞湴鍧寮濮嬶紝浣嗗疄闄呮儏鍐墊槸鍦ㄨ闂壒瀹氱被鍨嬪彉閲忕殑鏃跺欑粡甯稿湪鐗?
瀹氱殑鍐呭瓨鍦板潃璁塊棶錛岃繖灝遍渶瑕佸悇縐嶇被鍨嬫暟鎹寜鐓т竴瀹氱殑瑙勫垯鍦ㄧ┖闂翠笂鎺掑垪錛岃屼笉鏄『搴忕殑涓涓帴涓涓殑鎺掓斁錛岃繖灝辨槸瀵歸綈銆?br>
瀵歸綈鐨勪綔鐢ㄥ拰鍘熷洜錛氬悇涓‖浠跺鉤鍙板瀛樺偍絀洪棿鐨勫鐞嗕笂鏈夊緢澶х殑涓嶅悓銆備竴浜涘鉤鍙板鏌愪簺鐗瑰畾綾誨瀷鐨勬暟鎹彧鑳戒粠鏌愪簺鐗瑰畾鍦板潃寮濮嬪瓨鍙栥傛瘮濡傛湁浜涙灦鏋勭殑CPU鍦ㄨ闂?
涓涓病鏈夎繘琛屽榻愮殑鍙橀噺鐨勬椂鍊欎細(xì)鍙戠敓閿欒,閭d箞鍦ㄨ繖縐嶆灦鏋勪笅緙栫▼蹇呴』淇濊瘉瀛楄妭瀵歸綈.鍏朵粬騫沖彴鍙兘娌℃湁榪欑鎯呭喌錛屼絾鏄渶甯歌鐨勬槸濡傛灉涓嶆寜鐓ч傚悎鍏跺鉤鍙拌姹傚
鏁版嵁瀛樻斁榪涜瀵歸綈錛屼細(xì)鍦ㄥ瓨鍙栨晥鐜囦笂甯︽潵鎹熷け銆傛瘮濡傛湁浜涘鉤鍙版瘡嬈¤閮芥槸浠庡伓鍦板潃寮濮嬶紝濡傛灉涓涓猧nt鍨嬶紙鍋囪涓?2浣嶇郴緇燂級(jí)濡傛灉瀛樻斁鍦ㄥ伓鍦板潃寮濮嬬殑鍦版柟錛岄偅
涔堜竴涓鍛ㄦ湡灝卞彲浠ヨ鍑?guó)櫩?2bit錛岃屽鏋滃瓨鏀懼湪濂囧湴鍧寮濮嬬殑鍦版柟錛屽氨闇瑕?涓鍛ㄦ湡錛屽茍瀵逛袱嬈¤鍑虹殑緇撴灉鐨勯珮浣庡瓧鑺傝繘琛屾嫾鍑戞墠鑳藉緱鍒拌32bit鏁?
鎹傛樉鐒跺湪璇誨彇鏁堢巼涓婁笅闄嶅緢澶氥?/p>
浜?瀛楄妭瀵歸綈瀵圭▼搴忕殑褰卞搷:
鍏堣鎴戜滑鐪嬪嚑涓緥瀛愬惂(32bit,x86鐜,gcc緙栬瘧鍣?: 璁劇粨鏋勪綋濡備笅瀹氫箟錛?br>struct A { int a; char b; short c; }; struct B { char b; int a; short c; }; 鐜板湪宸茬煡32浣嶆満鍣ㄤ笂鍚勭鏁版嵁綾誨瀷鐨勯暱搴﹀涓? char:1(鏈夌鍙鋒棤絎﹀彿鍚? short:2(鏈夌鍙鋒棤絎﹀彿鍚? int:4(鏈夌鍙鋒棤絎﹀彿鍚? long:4(鏈夌鍙鋒棤絎﹀彿鍚? float:4 double:8 閭d箞涓婇潰涓や釜緇撴瀯澶у皬濡備綍鍛? 緇撴灉鏄? sizeof(strcut A)鍊間負(fù)8 sizeof(struct B)鐨勫煎嵈鏄?2
緇撴瀯浣揂涓寘鍚簡(jiǎn)4瀛楄妭闀垮害鐨刬nt涓涓紝1瀛楄妭闀垮害鐨刢har涓涓拰2瀛楄妭闀垮害鐨剆hort鍨嬫暟鎹竴涓?B涔熶竴鏍?鎸夌悊璇碅,B澶у皬搴旇閮芥槸7瀛楄妭銆?br>涔嬫墍浠ュ嚭鐜頒笂闈㈢殑緇撴灉鏄洜涓虹紪璇戝櫒瑕佸鏁版嵁鎴愬憳鍦ㄧ┖闂翠笂榪涜瀵歸綈銆備笂闈㈡槸鎸夌収緙栬瘧鍣ㄧ殑榛樿璁劇疆榪涜瀵歸綈鐨勭粨鏋?閭d箞鎴戜滑鏄笉鏄彲浠ユ敼鍙樼紪璇戝櫒鐨勮繖縐嶉粯璁ゅ榻愯緗憿,褰撶劧鍙互.渚嬪: #pragma pack (2) /*鎸囧畾鎸?瀛楄妭瀵歸綈*/ struct C { char b; int a; short c; }; #pragma pack () /*鍙栨秷鎸囧畾瀵歸綈錛屾仮澶嶇己鐪佸榻?/ sizeof(struct C)鍊兼槸8銆?br>淇敼瀵歸綈鍊間負(fù)1錛?br>#pragma pack (1) /*鎸囧畾鎸?瀛楄妭瀵歸綈*/ struct D { char b; int a; short c; }; #pragma pack () /*鍙栨秷鎸囧畾瀵歸綈錛屾仮澶嶇己鐪佸榻?/ sizeof(struct D)鍊間負(fù)7銆?br>鍚庨潰鎴戜滑鍐嶈瑙?pragma pack()鐨勪綔鐢?
涓?緙栬瘧鍣ㄦ槸鎸夌収浠涔堟牱鐨勫師鍒欒繘琛屽榻愮殑?
鍏堣鎴戜滑鐪嬪洓涓噸瑕佺殑鍩烘湰姒傚康錛?br>1.鏁版嵁綾誨瀷鑷韓鐨勫榻愬鹼細(xì) 瀵逛簬char鍨嬫暟鎹紝鍏惰嚜韜榻愬間負(fù)1錛屽浜巗hort鍨嬩負(fù)2錛屽浜巌nt,float,double綾誨瀷錛屽叾鑷韓瀵歸綈鍊間負(fù)4錛屽崟浣嶅瓧鑺傘?br>2.緇撴瀯浣撴垨鑰呯被鐨勮嚜韜榻愬鹼細(xì) 鍏舵垚鍛樹腑鑷韓瀵歸綈鍊兼渶澶х殑閭d釜鍊箋?br>3.鎸囧畾瀵歸綈鍊?/font>錛?pragma pack (value)鏃剁殑鎸囧畾瀵歸綈鍊紇alue銆?br>4.鏁版嵁鎴愬憳銆佺粨鏋勪綋鍜岀被鐨勬湁鏁堝榻愬鹼細(xì) 鑷韓瀵歸綈鍊煎拰鎸囧畾瀵歸綈鍊間腑灝忕殑閭d釜鍊箋?br>鏈?
浜?jiǎn)杩欎簺鍊鹼紝鎴戜滑灝卞彲浠ュ緢鏂逛究鐨勬潵璁ㄨ鍏蜂綋鏁版嵁緇撴瀯鐨勬垚鍛樺拰鍏惰嚜韜殑瀵歸綈鏂瑰紡銆傛湁鏁堝榻愬糔鏄渶緇堢敤鏉ュ喅瀹氭暟鎹瓨鏀懼湴鍧鏂瑰紡鐨勫鹼紝鏈閲嶈銆傛湁鏁堝榻怤錛屽氨鏄?
琛ㄧず“瀵歸綈鍦∟涓?#8221;錛屼篃灝辨槸璇磋鏁版嵁鐨?瀛樻斁璧峰鍦板潃%N=0".鑰屾暟鎹粨鏋勪腑鐨勬暟鎹彉閲忛兘鏄寜瀹氫箟鐨勫厛鍚庨『搴忔潵鎺掓斁鐨勩傜涓涓暟鎹彉閲忕殑璧峰鍦板潃灝辨槸鏁?
鎹粨鏋勭殑璧峰鍦板潃銆傜粨鏋勪綋鐨勬垚鍛樺彉閲忚瀵歸綈鎺掓斁錛岀粨鏋勪綋鏈韓涔熻鏍規(guī)嵁鑷韓鐨勬湁鏁堝榻愬煎渾鏁?灝辨槸緇撴瀯浣撴垚鍛樺彉閲忓崰鐢ㄦ婚暱搴﹂渶瑕佹槸瀵圭粨鏋勪綋鏈夋晥瀵歸綈鍊肩殑鏁存暟
鍊嶏紝緇撳悎涓嬮潰渚嬪瓙鐞嗚В)銆傝繖鏍峰氨涓嶈兘鐞嗚В涓婇潰鐨勫嚑涓緥瀛愮殑鍊間簡(jiǎn)銆?br>渚嬪瓙鍒嗘瀽錛?br>鍒嗘瀽渚嬪瓙B錛?br>struct B { char b; int a; short c; }; 鍋?
璁綛浠庡湴鍧絀洪棿0x0000寮濮嬫帓鏀俱傝渚嬪瓙涓病鏈夊畾涔夋寚瀹氬榻愬鹼紝鍦ㄧ瑪鑰呯幆澧冧笅錛岃鍊奸粯璁や負(fù)4銆傜涓涓垚鍛樺彉閲廱鐨勮嚜韜榻愬兼槸1錛屾瘮鎸囧畾鎴栬呴粯璁ゆ寚瀹?
瀵歸綈鍊?灝忥紝鎵浠ュ叾鏈夋晥瀵歸綈鍊間負(fù)1錛屾墍浠ュ叾瀛樻斁鍦板潃0x0000絎﹀悎0x0000%1=0.絎簩涓垚鍛樺彉閲廰錛屽叾鑷韓瀵歸綈鍊間負(fù)4錛屾墍浠ユ湁鏁堝榻愬間篃涓?錛?
鎵浠ュ彧鑳藉瓨鏀懼湪璧峰鍦板潃涓?x0004鍒?x0007榪欏洓涓繛緇殑瀛楄妭絀洪棿涓紝澶嶆牳0x0004%4=0,涓旂揣闈犵涓涓彉閲忋傜涓変釜鍙橀噺c,鑷韓瀵歸綈鍊間負(fù)
2錛屾墍浠ユ湁鏁堝榻愬間篃鏄?錛屽彲浠ュ瓨鏀懼湪0x0008鍒?x0009榪欎袱涓瓧鑺傜┖闂翠腑錛岀鍚?x0008%2=0銆傛墍浠ヤ粠0x0000鍒?x0009瀛樻斁鐨?
閮芥槸B鍐呭銆傚啀鐪嬫暟鎹粨鏋凚鐨勮嚜韜榻愬間負(fù)鍏跺彉閲忎腑鏈澶у榻愬?榪欓噷鏄痓錛夋墍浠ュ氨鏄?錛屾墍浠ョ粨鏋勪綋鐨勬湁鏁堝榻愬間篃鏄?銆傛牴鎹粨鏋勪綋鍦嗘暣鐨勮姹傦紝
0x0009鍒?x0000=10瀛楄妭錛岋紙10錛?錛夛紖4錛?銆傛墍浠?x0000A鍒?x000B涔熶負(fù)緇撴瀯浣揃鎵鍗犵敤銆傛晠B浠?x0000鍒?x000B
鍏辨湁12涓瓧鑺?sizeof(struct B)=12;鍏跺疄濡傛灉灝辮繖涓涓氨鏉ヨ瀹冨凡灝嗘弧瓚沖瓧鑺傚榻愪簡(jiǎn),
鍥犱負(fù)瀹冪殑璧峰鍦板潃鏄?,鍥犳鑲畾鏄榻愮殑,涔嬫墍浠ュ湪鍚庨潰琛ュ厖2涓瓧鑺?鏄洜涓虹紪璇戝櫒涓轟簡(jiǎn)瀹炵幇緇撴瀯鏁扮粍鐨勫瓨鍙栨晥鐜?璇曟兂濡傛灉鎴戜滑瀹氫箟浜?jiǎn)涓涓粨鏋凚鐨勬暟緇?閭?
涔堢涓涓粨鏋勮搗濮嬪湴鍧鏄?娌℃湁闂,浣嗘槸絎簩涓粨鏋勫憿?鎸夌収鏁扮粍鐨勫畾涔?鏁扮粍涓墍鏈夊厓绱犻兘鏄揣鎸ㄧ潃鐨?濡傛灉鎴戜滑涓嶆妸緇撴瀯鐨勫ぇ灝忚ˉ鍏呬負(fù)4鐨勬暣鏁板?閭d箞涓嬩竴
涓粨鏋勭殑璧峰鍦板潃灝嗘槸0x0000A,榪欐樉鐒朵笉鑳芥弧瓚崇粨鏋勭殑鍦板潃瀵歸綈浜?鍥犳鎴戜滑瑕佹妸緇撴瀯琛ュ厖鎴愭湁鏁堝榻愬ぇ灝忕殑鏁存暟鍊?鍏跺疄璇稿:瀵逛簬char鍨嬫暟鎹紝鍏?
鑷韓瀵歸綈鍊間負(fù)1錛屽浜巗hort鍨嬩負(fù)2錛屽浜巌nt,float,double綾誨瀷錛屽叾鑷韓瀵歸綈鍊間負(fù)4錛岃繖浜涘凡鏈夌被鍨嬬殑鑷韓瀵歸綈鍊間篃鏄熀浜庢暟緇勮冭檻鐨?鍙?
鏄洜涓鴻繖浜涚被鍨嬬殑闀垮害宸茬煡浜?鎵浠ヤ粬浠殑鑷韓瀵歸綈鍊間篃灝卞凡鐭ヤ簡(jiǎn). 鍚岀悊,鍒嗘瀽涓婇潰渚嬪瓙C錛?br>#pragma pack (2) /*鎸囧畾鎸?瀛楄妭瀵歸綈*/ struct C { char b; int a; short c; }; #pragma pack () /*鍙栨秷鎸囧畾瀵歸綈錛屾仮澶嶇己鐪佸榻?/ 絎?
涓涓彉閲廱鐨勮嚜韜榻愬間負(fù)1錛屾寚瀹氬榻愬間負(fù)2錛屾墍浠ワ紝鍏舵湁鏁堝榻愬間負(fù)1錛屽亣璁綜浠?x0000寮濮嬶紝閭d箞b瀛樻斁鍦?x0000錛岀鍚?x0000%1=
0;絎簩涓彉閲忥紝鑷韓瀵歸綈鍊間負(fù)4錛屾寚瀹氬榻愬間負(fù)2錛屾墍浠ユ湁鏁堝榻愬間負(fù)2錛屾墍浠ラ『搴忓瓨鏀懼湪0x0002銆?x0003銆?x0004銆?x0005鍥涗釜榪炵畫
瀛楄妭涓紝絎﹀悎0x0002%2=0銆傜涓変釜鍙橀噺c鐨勮嚜韜榻愬間負(fù)2錛屾墍浠ユ湁鏁堝榻愬間負(fù)2錛岄『搴忓瓨鏀?br>鍦?x0006銆?x0007涓紝絎﹀悎
0x0006%2=0銆傛墍浠ヤ粠0x0000鍒?x00007鍏卞叓瀛楄妭瀛樻斁鐨勬槸C鐨勫彉閲忋傚張C鐨勮嚜韜榻愬間負(fù)4錛屾墍浠鐨勬湁鏁堝榻愬間負(fù)2銆傚張8%2=0,C
鍙崰鐢?x0000鍒?x0007鐨勫叓涓瓧鑺傘傛墍浠izeof(struct C)=8.
鍥?濡備綍淇敼緙栬瘧鍣ㄧ殑榛樿瀵歸綈鍊?
1.鍦╒C IDE涓紝鍙互榪欐牱淇敼錛歔Project]|[Settings],c/c++閫夐」鍗ategory鐨凜ode Generation閫夐」鐨凷truct Member Alignment涓慨鏀癸紝榛樿鏄?瀛楄妭銆?br>2.鍦ㄧ紪鐮佹椂錛屽彲浠ヨ繖鏍峰姩鎬佷慨鏀癸細(xì)#pragma pack .娉ㄦ剰:鏄痯ragma鑰屼笉鏄痯rogma.
浜?閽堝瀛楄妭瀵歸綈,鎴戜滑鍦ㄧ紪紼嬩腑濡備綍鑰冭檻?
濡傛灉鍦ㄧ紪紼嬬殑鏃跺欒鑰冭檻鑺傜害絀洪棿鐨勮瘽,閭d箞鎴戜滑鍙渶瑕佸亣瀹氱粨鏋勭殑棣栧湴鍧鏄?,鐒跺悗鍚勪釜鍙橀噺鎸夌収涓婇潰鐨勫師鍒欒繘琛屾帓鍒楀嵆鍙?鍩烘湰鐨勫師鍒欏氨鏄妸緇撴瀯涓殑鍙橀噺鎸夌収
綾誨瀷澶у皬浠庡皬鍒板ぇ澹版槑,灝介噺鍑忓皯涓棿鐨勫~琛ョ┖闂?榪樻湁涓縐嶅氨鏄負(fù)浜?jiǎn)浠ソI洪棿鎹㈠彇鏃墮棿鐨勬晥鐜?鎴戜滑鏄劇ず鐨勮繘琛屽~琛ョ┖闂磋繘琛屽榻?姣斿:鏈変竴縐嶄嬌鐢ㄧ┖闂存崲鏃墮棿鍋?
娉曟槸鏄懼紡鐨勬彃鍏eserved鎴愬憳錛?br> struct A{ char a; char reserved[3];//浣跨敤絀洪棿鎹㈡椂闂?br> int b; } reserved鎴愬憳瀵規(guī)垜浠殑紼嬪簭娌℃湁浠涔堟剰涔?瀹冨彧鏄搗鍒板~琛ョ┖闂翠互杈懼埌瀛楄妭瀵歸綈鐨勭洰鐨?褰撶劧鍗充嬌涓嶅姞榪欎釜鎴愬憳閫氬父緙栬瘧鍣ㄤ篃浼?xì)缁欐垜浠嚜鍔ㄥ~琛ュ瘹w綈,鎴戜滑鑷繁鍔犱笂瀹冨彧鏄搗鍒版樉寮忕殑鎻愰啋浣滅敤.
鍏?瀛楄妭瀵歸綈鍙兘甯︽潵鐨勯殣鎮(zhèn)?
浠g爜涓叧浜庡榻愮殑闅愭?zhèn)eQ屽緢澶氭槸闅愬紡鐨勩傛瘮濡傚湪寮哄埗綾誨瀷杞崲鐨勬椂鍊欍備緥濡傦細(xì) unsigned int i = 0x12345678; unsigned char *p=NULL; unsigned short *p1=NULL;
p=&i; *p=0x00; p1=(unsigned short *)(p+1); *p1=0x0000; 鏈鍚庝袱鍙ヤ唬鐮侊紝浠庡鏁拌竟鐣屽幓璁塊棶unsignedshort鍨嬪彉閲忥紝鏄劇劧涓嶇鍚堝榻愮殑瑙勫畾銆?br>鍦▁86涓婏紝綾諱技鐨勬搷浣滃彧浼?xì)濯?jiǎng)鍝嶆晥鐜囷紝浣嗘槸鍦∕IPS鎴栬卻parc涓婏紝鍙兘灝辨槸涓涓猠rror,鍥犱負(fù)瀹冧滑瑕佹眰蹇呴』瀛楄妭瀵歸綈.
涓?濡備綍鏌ユ壘涓庡瓧鑺傚榻愭柟闈㈢殑闂:
濡傛灉鍑虹幇瀵歸綈鎴栬呰祴鍊奸棶棰橀鍏堟煡鐪?br>1. 緙栬瘧鍣ㄧ殑big little绔緗?br>2. 鐪嬭繖縐嶄綋緋繪湰韜槸鍚︽敮鎸侀潪瀵歸綈璁塊棶 3. 濡傛灉鏀寔鐪嬭緗簡(jiǎn)瀵歸綈涓庡惁,濡傛灉娌℃湁鍒欑湅璁塊棶鏃墮渶瑕佸姞鏌愪簺鐗規(guī)畩鐨勪慨楗版潵鏍囧織鍏剁壒孌婅闂搷浣溿?/p>
鍏?鐩稿叧鏂囩珷:杞嚜http://blog.csdn.net/goodluckyxl/archive/2005/10/17/506827.aspx
ARM涓嬬殑瀵歸綈澶勭悊 from DUI0067D_ADS1_2_CompLib
3.13 type qulifiers
鏈夐儴鍒嗘憳鑷狝RM緙栬瘧鍣ㄦ枃妗e榻愰儴鍒?/p>
瀵歸綈鐨勪嬌鐢? 1.__align(num) 榪欎釜鐢ㄤ簬淇敼鏈楂樼駭鍒璞$殑瀛楄妭杈圭晫銆傚湪姹囩紪涓嬌鐢↙DRD鎴栬匰TRD鏃?br> 灝辮鐢ㄥ埌姝ゅ懡浠_align(8)榪涜淇グ闄愬埗銆傛潵淇濊瘉鏁版嵁瀵硅薄鏄浉搴斿榻愩?br> 榪欎釜淇グ瀵硅薄鐨勫懡浠ゆ渶澶ф槸8涓瓧鑺傞檺鍒?鍙互璁?瀛楄妭鐨勫璞¤繘琛?瀛楄妭 瀵歸綈,浣嗘槸涓嶈兘璁?瀛楄妭鐨勫璞?瀛楄妭瀵歸綈銆?br> __align鏄瓨鍌ㄧ被淇敼,浠栧彧淇グ鏈楂樼駭綾誨瀷瀵硅薄涓嶈兘鐢ㄤ簬緇撴瀯鎴栬呭嚱鏁板璞°?br> 2.__packed __packed鏄繘琛屼竴瀛楄妭瀵歸綈 1.涓嶈兘瀵筽acked鐨勫璞¤繘琛屽榻?br> 2.鎵鏈夊璞$殑璇誨啓璁塊棶閮借繘琛岄潪瀵歸綈璁塊棶 3.float鍙?qiáng)鍖呭惈float鐨勭粨鏋勮仈鍚堝強(qiáng)鏈敤__packed鐨勫璞″皢涓嶈兘瀛楄妭瀵歸綈 4.__packed瀵瑰眬閮ㄦ暣褰㈠彉閲忔棤褰卞搷 5.寮哄埗鐢眜npacked瀵硅薄鍚憄acked瀵硅薄杞寲鏄湭瀹氫箟,鏁村艦鎸囬拡鍙互鍚堟硶瀹?br> 涔変負(fù)packed銆?br> __packed int* p; //__packed int 鍒欐病鏈夋剰涔?br> 6.瀵歸綈鎴栭潪瀵歸綈璇誨啓璁塊棶甯︽潵闂 __packed struct STRUCT_TEST { char a; int b; char c; } ; //瀹氫箟濡備笅緇撴瀯姝ゆ椂b鐨勮搗濮嬪湴鍧涓瀹氭槸涓嶅榻愮殑 //鍦ㄦ爤涓闂産鍙兘鏈夐棶棰?鍥犱負(fù)鏍堜笂鏁版嵁鑲畾鏄榻愯闂甗from CL] //灝嗕笅闈㈠彉閲忓畾涔夋垚鍏ㄥ眬闈?rùn)鎬佷笉鍦ㄦ爤涓? static char* p; static struct STRUCT_TEST a; void Main() { __packed int* q; //姝ゆ椂瀹氫箟鎴恄_packed鏉ヤ慨楗板綋鍓峲鎸囧悜涓洪潪瀵歸綈鐨勬暟鎹湴鍧涓嬮潰鐨勮闂垯鍙互
p = (char*)&a; q = (int*)(p+1); *q = 0x87654321; /* 寰楀埌璧嬪肩殑姹囩紪鎸囦護(hù)寰堟竻妤?br>ldr r5,0x20001590 ; = #0x12345678 [0xe1a00005] mov r0,r5 [0xeb0000b0] bl __rt_uwrite4 //鍦ㄦ澶勮皟鐢ㄤ竴涓啓4byte鐨勬搷浣滃嚱鏁? [0xe5c10000] strb r0,[r1,#0] //鍑芥暟榪涜4嬈trb鎿嶄綔鐒跺悗榪斿洖淇濊瘉浜?jiǎn)鏁版嵁姝<嫯鐨勮畨K棶 [0xe1a02420] mov r2,r0,lsr #8 [0xe5c12001] strb r2,[r1,#1] [0xe1a02820] mov r2,r0,lsr #16 [0xe5c12002] strb r2,[r1,#2] [0xe1a02c20] mov r2,r0,lsr #24 [0xe5c12003] strb r2,[r1,#3] [0xe1a0f00e] mov pc,r14 */
/* 濡傛灉q娌℃湁鍔燺_packed淇グ鍒欐眹緙栧嚭鏉ユ寚浠ゆ槸榪欐牱鐩存帴浼?xì)瀵艰嚧濂囧湴鍧澶勮闂け璐?br>[0xe59f2018] ldr r2,0x20001594 ; = #0x87654321 [0xe5812000] str r2,[r1,#0] */
//榪欐牱鍙互寰堟竻妤氱殑鐪嬪埌闈炲榻愯闂槸濡備綍浜х敓閿欒鐨?br>//浠ュ強(qiáng)濡備綍娑堥櫎闈炲榻愯闂甫鏉ラ棶棰?br>//涔熷彲浠ョ湅鍒伴潪瀵歸綈璁塊棶鍜屽榻愯闂殑鎸囦護(hù)宸紓瀵艱嚧鏁堢巼闂 ]]> 榪涚▼闂撮氳綆浠?/title> http://www.shnenglu.com/yehongly/archive/2008/10/09/63529.html鑼?/dc:creator>鑼?/author>Thu, 09 Oct 2008 03:20:00 GMT http://www.shnenglu.com/yehongly/archive/2008/10/09/63529.html http://www.shnenglu.com/yehongly/comments/63529.html http://www.shnenglu.com/yehongly/archive/2008/10/09/63529.html#Feedback 0 http://www.shnenglu.com/yehongly/comments/commentRss/63529.html http://www.shnenglu.com/yehongly/services/trackbacks/63529.html 鎵璋撹繘紼嬮棿閫氳錛岄【鍚嶆濅箟錛屽氨鏄湪2涓紙澶氭暟鎯呭喌涓嬶級(jí)鎴栧涓繘紼嬮棿浼犻掍俊鎭傛柟娉曞ぇ鑷村涓嬪嚑縐?
1, 鏂囦歡(file)錛屽尶鍚嶇閬?anonymous pipe),鍛藉悕綆¢亾(named pipe),淇″彿(signal).
2銆?nbsp; System V IPC 鍖呮嫭娑堟伅闃熷垪(message queue)錛屽叡浜唴瀛?shared memory)錛屼俊鍙烽噺(semaphore)銆傝繖縐嶅艦寮忕殑ipc棣栧厛鍦║NIX鍒嗘敮system V涓嬌鐢紝鐜板湪澶氭暟unix緋葷粺閮芥敮鎸併?br>
鏂囦歡褰㈠紡鐨処PC:
榪涚▼(process) A鍐欎俊鎭埌鏂囦歡1錛岃繘紼婤璇繪枃浠?銆傛枃浠剁殑鍐呭錛岀敱榪涚▼鑷繁鍐沖畾銆?br>
鍖垮悕綆¢亾錛?
command1 args1 | command2 args2. 鏈甯歌鐨勪緥瀛愶細(xì)ls –l |more
鐢變簬綆¢亾鎿嶄綔鐢眘hell浠f浛瀹屾垚錛屾病鏈変駭鐢熸湁鍚嶅瓧鐨勫疄浣擄紝鎵浠ョО涓哄尶鍚嶇閬撱?
Shell鍋氱殑浜嬫儏鏄皟鐢╬ipe()錛屼駭鐢熶竴涓閬擄紝鐒跺悗鎶奵ommand1鐨勮緭鍑?guó)櫩炴帴鍒敖帯閬撶殑鍑哄叆绔Q屾妸command2鐨勮緭鍏ヨ繛鎺ュ埌綆¢亾鐨勮緭鍑虹銆?br>
鍛藉悕綆¢亾
棣栧厛錛屽緩绔嬩竴涓壒孌婃枃浠訛紝mkfifo pipe1鎴栬卪knod fifo1 p
鐒跺悗錛屽氨褰撲綔姝e父鏂囦歡璇誨啓pipe1銆備緥濡傦細(xì) ls > fifo1 錛堝啓鍏ワ級(jí)銆?br>
while read a
do
echo $a
done (璇誨嚭)
鐢變簬浜х敓鏈夊悕瀛楃殑瀹炰綋錛屾墍浠ヨ縐頒負(fù)鍛藉悕綆¢亾銆?br>
淇″彿錛?
綆鍗曠殑鐢ㄦ硶錛?kill –USER2
pid,涔熷氨鏄氳繃kill()緋葷粺璋冪敤鎴栬卥ill鍛戒護(hù)錛屽彂閫佷俊鍙峰埌鍒殑榪涚▼銆傚悇涓繘紼嬪浜庝俊鍙風(fēng)殑澶勭悊榪囩▼鏄嚜宸卞畾涔夌殑錛堥櫎浜?錛屼篃灝辨槸KILL鏄己鍒?
鐨勶級(jí)銆傛瘮濡傝嚜宸卞彲浠ュ拷鐣UP,TERM錛孖NT(鎸塩ontrol-C), 絳夈?br>
娑堟伅闃熷垪(message queue)
娑堟伅闃熷垪錛屾槸涓涓槦鍒楃殑緇撴瀯錛岄槦鍒楅噷闈㈢殑鍐呭鐢辯敤鎴瘋繘紼嬭嚜宸卞畾涔夈傚疄闄呬笂錛岄槦鍒楅噷闈㈣褰曠殑鏄寚鍚戠敤鎴瘋嚜瀹氫箟緇撴瀯鐨勬寚閽堝拰緇撴瀯鐨勫ぇ灝忋傝浣跨敤message
queue錛岄鍏堣閫氳繃緋葷粺璋冪敤(msgget)浜х敓涓涓槦鍒楋紝鐒跺悗錛岃繘紼嬪彲浠ョ敤msgsnd鍙戦佹秷鎭埌榪欎釜闃熷垪錛屾秷鎭氨鏄涓婃墍璇寸殑緇撴瀯銆傚埆鐨勮繘紼嬬敤
msgrcv璇誨彇銆傛秷鎭槦鍒椾竴鏃︿駭鐢燂紝闄ら潪鏄庣‘鐨勫垹闄わ紙鏌愪釜鏈夋潈闄愮殑榪涚▼鎴栬呯敤ipcrm鍛戒護(hù)錛夋垨鑰呯郴緇熼噸鍚傚惁鍒欙紝浜х敓鐨勯槦鍒椾細(xì)涓鐩翠繚鐣欏湪緋葷粺涓傝?
涓旓紝鍙鏈夋潈闄愶紝灝卞彲浠ュ闃熷垪榪涜鎿嶄綔銆傛秷鎭槦鍒楀拰綆¢亾寰堢浉浼鹼紝瀹為檯涓婏紝綆¢亾灝辨槸鐢ㄦ埛娑堟伅涓?涓瓧鑺傜殑闃熷垪銆?br>
ipcs –aq鍛戒護(hù)鍙互鏌ョ湅message queue鐨勭姸鍐碉細(xì)
Message Queues:
T ID KEY MODE OWNER GROUP CREATOR CGROUP
CBYTES QNUM QBYTES LSPID LRPID STIME RTIME CTIME
q 256 0x417d0896 --rw------- root daemon root daemon
0 0 16384 97737 210466 14:31:14 14:31:14 9:52:53
鍏朵腑錛?br>
T: 綾誨瀷, q 琛ㄦ槑榪欐槸涓秷鎭槦鍒?br>
ID: 鐢ㄦ埛鑷繁瀹氫箟鐨勶紝鍦ㄨ皟鐢╩sgget鏃朵紶閫佺殑鍙傛暟銆?br>
Key: 緋葷粺榪旇繕鐨勫叏灞鍞竴鐨処D銆?br>
Mode: 鏉冮檺錛屽惈涔夊拰鏂囦歡鏉冮檺鍩烘湰涓鑷?br>
Owner, group: 闃熷垪寤虹珛鑰呯殑鍚嶅瓧鍜岀粍
CREATOR, CGROUP錛氶槦鍒楀緩绔嬭呭拰緇勭殑ID
CBYTES : 鐩墠queue鍦ㄩ槦鍒楅噷鐨勫瓧鑺傛暟
QNUM錛?鐩墠queue鍦ㄩ槦鍒楅噷鐨勬秷鎭暟
QBYTES: 闃熷垪涓秷鎭渶澶у厑璁稿瓧鑺傛暟
LSPID: 鏈鍚庡彂閫佽匬ID
LRPID: 鏈鍚庢帴鍙楄匬ID
STIME: 鏈鍚庡彂閫佹椂闂?br>
RTIME: 鏈鍚庢帴鍙楁椂闂淬?
CTIME: 寤虹珛鎴栬呮渶鍚庝慨鏀圭殑鏃墮棿
鍏變韓鍐呭瓨(shared memory)
鍏變韓鍐呭瓨鏄竴孌靛彲浠ヨ澶氫釜榪涚▼鍏變韓鐨勫唴瀛樻銆傞鍏堬紝鐢╯hmget緋葷粺璋冪敤浜х敓鎸囧畾澶у皬鐨勫叡浜唴瀛樻錛岀劧鍚庨渶瑕佽闂鍏變韓鍐呭瓨鐨勮繘紼嬭皟鐢╯hmat緋葷粺璋?
鐢紝鎶婅繖涓唴瀛樻闄勫姞鍒拌嚜宸辯殑鍦板潃絀洪棿錛岀劧鍚庡氨鍙互鍍忚闂嚜宸辯鏈夌殑鍐呭瓨涓鏍瘋闂繖涓唴瀛樻浜?jiǎn)銆傜瓑鍒拌闂畬姣曪紝鐢╯hmdt鑴辯銆傚悓message
queue涓鏍鳳紝鍏變韓鍐呭瓨涓鏃︿駭鐢燂紝闄ら潪鏄庣‘鐨勫垹闄わ紙鏌愪釜鏈夋潈闄愮殑榪涚▼鎴栬呯敤ipcrm鍛戒護(hù)錛夋垨鑰呯郴緇熼噸鍚傚惁鍒欙紝浜х敓鐨勫叡浜唴瀛樹細(xì)涓鐩翠繚鐣欏湪緋葷粺涓傝?
涓旓紝鍙鏈夋潈闄愶紝灝卞彲浠ュ鍏變韓鍐呭瓨榪涜鎿嶄綔銆傚叡浜唴瀛樼殑鍐呭鐢辮繘紼嬭嚜宸卞畾涔夈備負(fù)浜?jiǎn)闃叉澶氫釜杩浗E嬪湪鍚屼竴鏃墮棿鍐欏悓鏍蜂竴孌靛叡浜唴瀛橈紝涓鑸▼搴忎細(xì)浣跨敤淇″彿閲忔潵鎺у埗
瀵規(guī)煇涓孌靛湴鍧鐨勮鍐欍?br>
ipcs –am鍛戒護(hù)鍙互鏌ョ湅share memory鐨勭姸鍐碉細(xì)
Shared Memory:
T ID KEY MODE OWNER GROUP CREATOR CGROUP
NATTCH SEGSZ CPID LPID ATIME DTIME CTIME
m 258 0 --rw-r----- oracle dba oracle dba
12 8388608 106303 106329 16:28:54 16:48:36 16:28:49
T: 綾誨瀷 m 琛ㄦ槑榪欐槸涓叡浜唴瀛?br>
ID: 鐢ㄦ埛鑷繁瀹氫箟鐨勶紝鍦ㄨ皟鐢╯hmget鏃朵紶閫佺殑鍙傛暟銆?br>
Key: 緋葷粺榪旇繕鐨勫叏灞鍞竴鐨処D銆?br>
Mode: 鏉冮檺錛屽惈涔夊拰鏂囦歡鏉冮檺鍩烘湰涓鑷?br>
Owner, group: 闃熷垪寤虹珛鑰呯殑鍚嶅瓧鍜岀粍
CREATOR, CGROUP錛氶槦鍒楀緩绔嬭呭拰緇勭殑ID
NATTCH: 鏈夊嚑涓繘紼嬫寕鎺?attach)鍦ㄨ繖孌靛叡浜唴瀛樹笂
SEGSZ: 鍏變韓鍐呭瓨孌靛ぇ灝忥紙瀛楄妭錛?br>
CPID: 浜х敓鑰匬ID
LPID: 鏈鍚庢寕鎺?attach)鎴栬呰劚紱?detach)鑰匬ID
ATIME: 鏈鍚庢寕鎺?attach)鏃墮棿
DTIME: 鏈鍚庤劚紱?detach)鏃墮棿銆?
CTIME: 寤虹珛鎴栬呮渶鍚庝慨鏀圭殑鏃墮棿
淇″彿閲?semaphore)
鍦ㄦ搷浣滅郴緇熶腑錛屾湁浜涜祫婧愭暟閲忔槸鏈夐檺鐨勶紝鍦ㄥ悓涓鏃墮棿錛屽彧鑳界敱鏈夐檺錛堜竴涓垨鍑犱釜錛夌殑榪涚▼浣跨敤鍜岃闂備緥濡傜甯︽満錛屽悓涓鏃墮棿錛屽彧鑳界敱涓涓繘紼嬩嬌鐢ㄣ傝繖鏍風(fēng)殑璧勬簮琚?
縐頒負(fù)鍏抽敭錛坈ritical錛夎祫婧愩備俊鍙烽噺灝辨槸鐢ㄦ潵璁板綍鍏抽敭璧勬簮鐨勪嬌鐢ㄦ儏鍐電殑銆傞鍏堬紝鍒╃敤緋葷粺璋冪敤semget浜х敓涓涓俊鍙烽噺銆傚綋闇瑕佷嬌鐢ㄥ叧閿祫婧愭椂錛岃皟
鐢╯emop錛屼紶閫掔殑鍙傛暟涓洪渶瑕佷嬌鐢ㄧ殑璧勬簮鐨勬暟閲忥紝渚嬪2涓紝鍙傛暟灝變負(fù)+2銆傚鏋滆繖涓祫婧愭湁2涓垨鑰呮洿澶氬彲鐢紝榪涚▼灝辮幏寰椾簡(jiǎn)浣跨敤鏉冿紝鍚﹀垯灝卞繀欏葷瓑寰咃紝鐩村埌
鏈夎凍澶熺殑璧勬簮鍙敤銆傚綋榪涚▼浣跨敤璧勬簮緇撴潫鐨勬椂鍊欙紝涔熺敤semop閲婃斁鍏抽敭璧勬簮銆傚弬鏁頒負(fù)闇瑕侀噴鏀劇殑鏁伴噺錛屼緥濡?錛屽弬鏁頒負(fù)-2銆傚悓message
queue涓鏍鳳紝鍏變俊鍙烽噺涓鏃︿駭鐢燂紝闄ら潪鏄庣‘鐨勫垹闄わ紙鏌愪釜鏈夋潈闄愮殑榪涚▼鎴栬呯敤ipcrm鍛戒護(hù)錛夋垨鑰呯郴緇熼噸鍚傚惁鍒欙紝淇″彿閲忎細(xì)涓鐩翠繚鐣欏湪緋葷粺涓傝屼笖錛屽彧瑕?
鏈夋潈闄愶紝灝卞彲浠ュ鍏惰繘琛屾搷浣溿?br>
ipcs –as鍛戒護(hù)鍙互鏌ョ湅Semaphore鐨勭姸鍐碉細(xì)
Semaphores:
T ID KEY MODE OWNER GROUP CREATOR CGROUP NSEMS OTIME CTIME
s 0 0x696e6974 --ra-r--r-- root system root system 8 9:52:53 9:59:30
T: 綾誨瀷 s 琛ㄦ槑榪欐槸涓俊鍙烽噺
ID: 鐢ㄦ埛鑷繁瀹氫箟鐨勶紝鍦ㄨ皟鐢╯emget鏃朵紶閫佺殑鍙傛暟銆?br>
Key: 緋葷粺榪旇繕鐨勫叏灞鍞竴鐨処D銆?br>
Mode: 鏉冮檺錛屽惈涔夊拰鏂囦歡鏉冮檺鍩烘湰涓鑷?br>
Owner, group: 闃熷垪寤虹珛鑰呯殑鍚嶅瓧鍜岀粍
CREATOR, CGROUP錛氶槦鍒楀緩绔嬭呭拰緇勭殑ID
NSEMS: 鏈俊鍙烽噺涓婁俊鍙風(fēng)殑鏁伴噺銆?br>
OTIME: 鏈鍚庝竴嬈℃搷浣?semop)鐨勬椂闂?br>
CTIM: 寤虹珛鎴栬呮渶鍚庝慨鏀圭殑鏃墮棿
]]> System V IPC 涔?Message Queue http://www.shnenglu.com/yehongly/archive/2008/10/09/63514.html鑼?/dc:creator>鑼?/author>Thu, 09 Oct 2008 01:03:00 GMT http://www.shnenglu.com/yehongly/archive/2008/10/09/63514.html http://www.shnenglu.com/yehongly/comments/63514.html http://www.shnenglu.com/yehongly/archive/2008/10/09/63514.html#Feedback 0 http://www.shnenglu.com/yehongly/comments/commentRss/63514.html http://www.shnenglu.com/yehongly/services/trackbacks/63514.html
鍦ˋPUE 14.7鑺傚娑堟伅闃熷垪鐨勮瑙d腑錛屾渶鍚庝竴孌佃“鎴戜滑寰楀嚭鐨勭粨璁烘槸錛氬湪鏂扮殑搴旂敤紼嬪紡涓笉搴斿綋鍐嶄嬌鐢ㄤ粬浠?#8221; 铏界劧鍦ㄦ柊鐨勫簲鐢ㄧ▼寮忎腑涓嶅簲璇ュ啀浣跨敤娑堟伅闃熷垪錛屾垜涔熸病鏈夋庝箞浣跨敤榪嘢ystem V IPC鎬昏寰楀湪UNIX/Linux緙栫▼涓皯浜?jiǎn)浠涔堬紝涔熻瀛︿範(fàn)涓涓婼ystem V IPC瀵規(guī)垜鐨勮嚜淇″績(jī)浼?xì)鏈夌浉褰撳ぇ鐨勫府鍔╁Q屼粠姝ゆ垜涔熸暍璁叉垜鐭ラ亾濡備綍浣跨敤IPC浜?jiǎn)銆?br>
鍏堟妸鍚勪釜鍑芥暟鍘熷艦鍒楀嚭銆?br> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget(key_t key, int msgflag); int msgsnd(int msgid, struct msgbuf *msgp, size_t msgsz, int msgflag); ssize_t msgrcv(int msgid, struct msgbuf *msgp, size_t msgsz, long msgtype, int msgflag); int msgctl(int msgid, int cmd, struct msqid_ds *buf);
msgget()鐢ㄦ潵鍒涘緩Message Queue錛堟湇鍔$錛夋垨鍜屼竴涓凡寤虹珛鐨凪essage
Queue榪炴帴錛堝鎴風(fēng)錛夈俴ey錛屾寚瀹氱敤鏉ョ敓鎴恗essage
id鐨勫叧閿瓧錛宮sgflag鍜宱pen()鐨刦lags寰堢浉浼鹼紝鍙敤IPC_CREAT, IPC_EXECL, S_IRUSR絳夈?br> 鍦ㄦ湇鍔$錛屽彲鐢↖PC_PRIVATE錛堟垨0錛夋潵鎸囧畾key鍊鹼紝鏉ョ敓鎴愪竴涓柊鐨凪essage Queue,鎴栦嬌鐢ㄦ寚瀹氱殑key鍊?32浣嶇殑鏃犵鍙鋒暟錛夛紝鎴栦嬌鐢╢tok()鏉ョ敓鎴愪竴涓猭ey銆?br> #include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);
鍦ㄥ鎴風(fēng)錛岃兘澶熺洿鎺ヤ嬌鐢ㄦ湇鍔$鐢熸垚鐨刴essage
id錛堥氳繃鏌愪簺閫斿緞浼犻侊紝濡傛枃妗o紝鐖跺瓙榪涚▼錛夛紝涔熻兘澶熺敤msgget閫氳繃鍜屾湇鍔$浣跨敤鐩稿悓鐨刱ey鍊兼潵鐢熸垚鐩稿悓鐨刴essage
id錛屼絾涓嶈兘浣跨敤IPC_PRIVATE錛堟垨0錛夛紝msgflag涔熶笉鑳戒嬌鐢↖PC_CREAT銆?/sys>
Return Value: Sucess return value is the message id(non-negative integer), otherwise -1 return. msgsnd()鐢ㄦ潵鍙戦佹秷鎭?br> struct msgbuf { long mtype; char mtext[1]; }; msgsz鐨勮綆楁柟娉曪細(xì) msgsz = sizeof(msgbuf) - sizeof(long); msgflag鏈変竴涓爣蹇楋細(xì)IPC_NOWAIT銆傚綋娑堟伅闃熷垪宸叉弧錛堝彲鑳芥槸娑堟伅鎬繪暟杈懼埌浜?jiǎn)闄愬埗鍊鹼紝涔熷彲鑳芥槸闃熷垪涓瓧鑺傛繪暟杈懼埌浜?jiǎn)闄愬埗鍊鹼級(jí)錛岀珛鍗沖嚭閿欒繑鍥烇紝鍋囧娌℃湁鎸囧畾錛屽垯闃誨銆?/p>
msgrcv()鐢ㄦ潵鎺ユ敹娑堟伅銆俶sgtype鐢ㄦ潵鎸囧畾璇誨彇鐨勬秷鎭被鍨嬨俶sgtype == 0, 榪斿洖絎竴涓秷鎭紱 msgtype >
0, 榪斿洖娑堟伅綾誨瀷涓簃sgtype鐨勬秷鎭紱msgtype < 0錛?榪斿洖闃熷垪涓被鍨嬪煎皬浜巑sgtype鐨勭粷瀵瑰肩殑娑堟伅闆嗕腑鏈灝忕殑娑堟伅銆?br> msgflag鏈変袱涓鹼細(xì)MSG_NOERROR, IPC_NOWAIT銆傚綋MSG_NOERROR琚寚瀹氱殑鏃跺欙紝鑻ユ秷鎭お闀垮氨琚埅鏂紝鍚﹀垯榪斿洖閿欒錛汭PC_NOWAIT鐢ㄤ簬闇瑕佽鍙栫殑娑堟伅涓嶅瓨鍦ㄦ椂鍒欓樆濉炪?/p>
msgctl鐢ㄤ簬鎺у埗娑堟伅闃熷垪銆俢md鏈変笁縐嶅鹼細(xì)IPC_STAT,IPC_SET,IPC_RMID銆?br> IPC_STAT鐢ㄤ簬鍙栧嚭娑堟伅闃熷垪鐨?msqid_ds緇撴瀯騫朵繚瀛樺埌buf涓?br> IPC_SET鐢ㄦ潵鎶奲uf鎸囧悜鐨刴sqid_ds錛岄厤緗垚娑堟伅闃熷垪鐨刴sqid_ds銆傚彧鏈夊洓涓艱兘澶熸洿鏀癸細(xì)msg_perm.uid, msg_perm.gid,msg_perm.mode, msg_qbytes銆?br> IPC_RMID鐢ㄦ潵鍒犻櫎娑堟伅闃熷垪銆?br> struct msqid_ds { struct ipc_perm msg_perm; ulong msg_qbytes; //max of bytes of queue ... }; struct ipc_perm { uid_t uid; //owner's effective user id gid_t gid; //owner's effective group id uid_t cuid; //creator's effective user id gid_t cgid; //creator's effective group id mode_t mode; //access modes ulong seq; //slot usage sequence number key_t key; };
]]> Linux涓嬬殑澶氳繘紼嬬紪紼嬪垵姝?/title> http://www.shnenglu.com/yehongly/archive/2008/10/08/63476.html鑼?/dc:creator>鑼?/author>Wed, 08 Oct 2008 07:47:00 GMT http://www.shnenglu.com/yehongly/archive/2008/10/08/63476.html http://www.shnenglu.com/yehongly/comments/63476.html http://www.shnenglu.com/yehongly/archive/2008/10/08/63476.html#Feedback 0 http://www.shnenglu.com/yehongly/comments/commentRss/63476.html http://www.shnenglu.com/yehongly/services/trackbacks/63476.html 鏂囩珷鎽樿: 銆銆 澶氱嚎紼嬬▼搴忚璁$殑姒傚康鏃╁湪鍏崄騫翠唬灝辮鎻愬嚭錛屼絾鐩村埌鍏崄騫翠唬涓湡錛孶nix緋葷粺涓墠寮曞叆澶氱嚎紼嬫満鍒訛紝濡備粖錛岀敱浜庤嚜韜殑璁稿浼樼偣錛屽綰跨▼緙栫▼宸茬粡寰楀埌浜?jiǎn)骞挎硾鐨勫簲鐢ㄣ傛湰鏂囨垜浠皢浠嬬粛鍦↙inux涓嬬紪鍐欏榪涚▼鍜屽綰跨▼紼嬪簭鐨勪竴浜涘垵姝ョ煡璇嗐? -------------------------------------------------------------------------------- 姝f枃: Linux涓嬬殑澶氳繘紼嬬紪紼嬪垵姝? 1 寮曡█
瀵逛簬娌℃湁鎺ヨЕ榪嘦nix/Linux鎿嶄綔緋葷粺鐨勪漢鏉ヨ錛宖ork鏄渶闅劇悊瑙g殑姒傚康涔嬩竴錛氬畠鎵ц涓嬈″嵈榪斿洖涓や釜鍊箋俧ork鍑芥暟鏄疷nix緋葷粺鏈鏉板嚭鐨勬垚灝?
涔嬩竴錛屽畠鏄竷鍗佸勾浠NIX鏃╂湡鐨勫紑鍙戣呯粡榪囬暱鏈熷湪鐞嗚鍜屽疄璺典笂鐨勮壈鑻︽帰绱㈠悗鍙栧緱鐨勬垚鏋滐紝涓鏂歸潰錛屽畠浣挎搷浣滅郴緇熷湪榪涚▼綆$悊涓婁粯鍑轟簡(jiǎn)鏈灝忕殑浠d環(huán)錛屽彟涓鏂歸潰錛?
鍙堜負(fù)紼嬪簭鍛樻彁渚涗簡(jiǎn)涓涓畝媧佹槑浜?jiǎn)鐨勫杩浗E嬫柟娉曘備笌DOS鍜屾棭鏈熺殑Windows涓嶅悓錛孶nix/Linux緋葷粺鏄湡姝e疄鐜板浠誨姟鎿嶄綔鐨勭郴緇燂紝鍙互璇達(dá)紝涓嶄嬌鐢?
澶氳繘紼嬬紪紼嬶紝灝變笉鑳界畻鏄湡姝g殑Linux鐜涓嬬紪紼嬨? 銆銆 澶氱嚎紼嬬▼搴忚璁$殑姒傚康鏃╁湪鍏崄騫翠唬灝辮鎻愬嚭錛屼絾鐩村埌鍏崄騫翠唬涓湡錛孶nix緋葷粺涓墠寮曞叆澶氱嚎紼嬫満鍒訛紝濡備粖錛岀敱浜庤嚜韜殑璁稿浼樼偣錛屽綰跨▼緙栫▼宸茬粡寰楀埌浜?jiǎn)骞挎硾鐨勫簲鐢ㄣ? 銆銆 涓嬮潰錛屾垜浠皢浠嬬粛鍦↙inux涓嬬紪鍐欏榪涚▼鍜屽綰跨▼紼嬪簭鐨勪竴浜涘垵姝ョ煡璇嗐? 2 澶氳繘紼嬬紪紼?
浠涔堟槸涓涓繘紼嬶紵榪涚▼榪欎釜姒傚康鏄拡瀵圭郴緇熻屼笉鏄拡瀵圭敤鎴風(fēng)殑錛屽鐢ㄦ埛鏉ヨ錛屼粬闈㈠鐨勬蹇墊槸紼嬪簭銆傚綋鐢ㄦ埛鏁插叆鍛戒護(hù)鎵ц涓涓▼搴忕殑鏃跺欙紝瀵圭郴緇熻岃█錛屽畠?yōu)畣鍚姩涓
涓繘紼嬨備絾鍜岀▼搴忎笉鍚岀殑鏄紝鍦ㄨ繖涓繘紼嬩腑錛岀郴緇熷彲鑳介渶瑕佸啀鍚姩涓涓垨澶氫釜榪涚▼鏉ュ畬鎴愮嫭绔嬬殑澶氫釜浠誨姟銆傚榪涚▼緙栫▼鐨勪富瑕佸唴瀹瑰寘鎷繘紼嬫帶鍒跺拰榪涚▼闂撮氫俊錛屽湪浜?
瑙h繖浜涗箣鍓嶏紝鎴戜滑鍏堣綆鍗曠煡閬撹繘紼嬬殑緇撴瀯銆? 銆 2.1 Linux涓嬭繘紼嬬殑緇撴瀯 銆銆 Linux涓嬩竴涓繘紼嬪湪鍐呭瓨閲屾湁涓夐儴鍒嗙殑鏁版嵁錛屽氨鏄?浠g爜孌?銆?鍫嗘爤孌?鍜?鏁版嵁孌?銆傚叾瀹炲榪囨眹緙栬璦鐨勪漢涓瀹氱煡閬擄紝涓鑸殑CPU閮芥湁涓婅堪涓夌孌靛瘎瀛樺櫒錛屼互鏂逛究鎿嶄綔緋葷粺鐨勮繍琛屻傝繖涓変釜閮ㄥ垎涔熸槸鏋勬垚涓涓畬鏁寸殑鎵ц搴忓垪鐨勫繀瑕佺殑閮ㄥ垎銆?
"浠g爜孌?錛岄【鍚嶆濅箟錛屽氨鏄瓨鏀句簡(jiǎn)紼嬪簭浠g爜鐨勬暟鎹紝鍋囧鏈哄櫒涓湁鏁頒釜榪涚▼榪愯鐩稿悓鐨勪竴涓▼搴忥紝閭d箞瀹冧滑灝卞彲浠ヤ嬌鐢ㄧ浉鍚岀殑浠g爜孌點(diǎn)?鍫嗘爤孌?瀛樻斁鐨勫氨鏄瓙紼?
搴忕殑榪斿洖鍦板潃銆佸瓙紼嬪簭鐨勫弬鏁頒互鍙?qiáng)绋嬪簭鐨勫眬閮ㄥ彉閲忋傝屾暟鎹鍒欏瓨鏀劇▼搴忕殑鍏ㄥ眬鍙橀噺錛屽父鏁頒互鍙?qiáng)鍔ㄦ佹暟鎹垎閰嶇殑鏁版嵁絀洪棿錛堟瘮濡傜敤malloc涔嬬被鐨勫嚱鏁板彇寰楃殑絀?
闂達(dá)級(jí)銆傝繖鍏朵腑鏈夎澶氱粏鑺傞棶棰橈紝榪欓噷闄愪簬綃囧箙灝變笉澶氫粙緇嶄簡(jiǎn)銆傜郴緇熷鏋滃悓鏃惰繍琛屾暟涓浉鍚岀殑紼嬪簭錛屽畠浠箣闂村氨涓嶈兘浣跨敤鍚屼竴涓爢鏍堟鍜屾暟鎹銆? 銆 2.2 Linux涓嬬殑榪涚▼鎺у埗
鍦ㄤ紶緇熺殑Unix鐜涓嬶紝鏈変袱涓熀鏈殑鎿嶄綔鐢ㄤ簬鍒涘緩鍜屼慨鏀硅繘紼嬶細(xì)鍑芥暟fork(
)鐢ㄦ潵鍒涘緩涓涓柊鐨勮繘紼嬶紝璇ヨ繘紼嬪嚑涔庢槸褰撳墠榪涚▼鐨勪竴涓畬鍏ㄦ嫹璐濓紱鍑芥暟鏃廵xec(
)鐢ㄦ潵鍚姩鍙﹀鐨勮繘紼嬩互鍙栦唬褰撳墠榪愯鐨勮繘紼嬨侺inux鐨勮繘紼嬫帶鍒跺拰浼犵粺鐨刄nix榪涚▼鎺у埗鍩烘湰涓鑷達(dá)紝鍙湪涓浜涚粏鑺傜殑鍦版柟鏈変簺鍖哄埆錛屼緥濡傚湪Linux緋葷粺
涓皟鐢╲fork鍜宖ork瀹屽叏鐩稿悓錛岃屽湪鏈変簺鐗堟湰鐨刄nix緋葷粺涓紝vfork璋冪敤鏈変笉鍚岀殑鍔熻兘銆傜敱浜庤繖浜涘樊鍒嚑涔庝笉褰卞搷鎴戜滑澶у鏁扮殑緙栫▼錛屽湪榪欓噷鎴戜滑
涓嶄簣鑰冭檻銆? 銆銆 2.2.1 fork( ) 銆銆 fork鍦ㄨ嫳鏂囦腑鏄?鍒嗗弶"鐨勬剰鎬濄備負(fù)浠涔堝彇榪欎釜鍚嶅瓧鍛紵鍥犱負(fù)涓涓繘紼嬪湪榪愯涓紝濡傛灉浣跨敤浜?jiǎn)fork錛屽氨浜х敓浜?jiǎn)鍙︿竴涓繘紼嬶紝浜庢槸榪涚▼灝?鍒嗗弶"浜?jiǎn)锛屾墍浠ヨ繖涓悕瀛楀彇寰楀緢褰㈣薄銆備笅闈㈠氨鐪嬬湅濡備綍鍏蜂綋浣跨敤fork錛岃繖孌電▼搴忔紨紺轟簡(jiǎn)浣跨敤fork鐨勫熀鏈鏋訛細(xì) void main(){ int i; if ( fork() == 0 ) { /* 瀛愯繘紼嬬▼搴?*/ for ( i = 1; i <1000; i ++ ) printf("This is child process\n"); } else { /* 鐖惰繘紼嬬▼搴?/ for ( i = 1; i <1000; i ++ ) printf("This is process process\n"); } } 銆銆 紼嬪簭榪愯鍚庯紝浣犲氨鑳界湅鍒板睆騫曚笂浜ゆ浛鍑虹幇瀛愯繘紼嬩笌鐖惰繘紼嬪悇鎵撳嵃鍑虹殑涓鍗冩潯淇℃伅浜?jiǎn)銆傚鏋滅▼搴忚繕鍦ㄨ繍琛屼腑錛屼綘鐢╬s鍛戒護(hù)灝辮兘鐪嬪埌緋葷粺涓湁涓や釜瀹冨湪榪愯浜?jiǎn)銆?
閭d箞璋冪敤榪欎釜fork鍑芥暟鏃跺彂鐢熶簡(jiǎn)浠涔堝憿錛焒ork鍑芥暟鍚姩涓涓柊鐨勮繘紼嬶紝鍓嶉潰鎴戜滑璇磋繃錛岃繖涓繘紼嬪嚑涔庢槸褰撳墠榪涚▼鐨勪竴涓嫹璐濓細(xì)瀛愯繘紼嬪拰鐖惰繘紼嬩嬌鐢ㄧ浉鍚岀殑浠?
鐮佹錛涘瓙榪涚▼澶嶅埗鐖惰繘紼嬬殑鍫嗘爤孌靛拰鏁版嵁孌點(diǎn)傝繖鏍鳳紝鐖惰繘紼嬬殑鎵鏈夋暟鎹兘鍙互鐣欑粰瀛愯繘紼嬶紝浣嗘槸錛屽瓙榪涚▼涓鏃﹀紑濮嬭繍琛岋紝铏界劧瀹冪戶鎵夸簡(jiǎn)鐖惰繘紼嬬殑涓鍒囨暟鎹紝浣嗗疄闄呬笂
鏁版嵁鍗村凡緇忓垎寮錛岀浉浜掍箣闂翠笉鍐嶆湁褰卞搷浜?jiǎn)锛屼篃灏辨槸璇村Q屽畠浠箣闂翠笉鍐嶅叡浜換浣曟暟鎹簡(jiǎn)銆傚畠浠啀瑕佷氦浜掍俊鎭椂錛屽彧鏈夐氳繃榪涚▼闂撮氫俊鏉ュ疄鐜幫紝榪欏皢鏄垜浠笅闈㈢殑鍐呭銆?
鏃㈢劧瀹冧滑濡傛鐩歌薄錛岀郴緇熷浣曟潵鍖哄垎瀹冧滑鍛紵榪欐槸鐢卞嚱鏁扮殑榪斿洖鍊兼潵鍐沖畾鐨勩傚浜庣埗榪涚▼錛宖ork鍑芥暟榪斿洖浜?jiǎn)瀛惤E嬪簭鐨勮繘紼嬪彿錛岃屽浜庡瓙紼嬪簭錛宖ork鍑芥暟鍒欒繑
鍥為浂銆傚湪鎿嶄綔緋葷粺涓紝鎴戜滑鐢╬s鍑芥暟灝卞彲浠ョ湅鍒頒笉鍚岀殑榪涚▼鍙鳳紝瀵圭埗榪涚▼鑰岃█錛屽畠鐨勮繘紼嬪彿鏄敱姣斿畠鏇翠綆灞傜殑緋葷粺璋冪敤璧嬩簣鐨勶紝鑰屽浜庡瓙榪涚▼鑰岃█錛屽畠鐨勮繘紼嬪彿鍗?
鏄痜ork鍑芥暟瀵圭埗榪涚▼鐨勮繑鍥炲箋傚湪紼嬪簭璁捐涓紝鐖惰繘紼嬪拰瀛愯繘紼嬮兘瑕佽皟鐢ㄥ嚱鏁癴ork錛堬級(jí)涓嬮潰鐨勪唬鐮侊紝鑰屾垜浠氨鏄埄鐢╢ork錛堬級(jí)鍑芥暟瀵圭埗瀛愯繘紼嬬殑涓嶅悓榪?
鍥炲肩敤if...else...璇彞鏉ュ疄鐜拌鐖跺瓙榪涚▼瀹屾垚涓嶅悓鐨勫姛鑳斤紝姝e鎴戜滑涓婇潰涓劇殑渚嬪瓙涓鏍楓傛垜浠湅鍒幫紝涓婇潰渚嬪瓙鎵ц鏃朵袱鏉′俊鎭槸浜や簰鏃犺鍒欑殑鎵撳嵃鍑?
鏉ョ殑錛岃繖鏄埗瀛愯繘紼嬬嫭绔嬫墽琛岀殑緇撴灉錛岃櫧鐒舵垜浠殑浠g爜浼間箮鍜屼覆琛岀殑浠g爜娌℃湁浠涔堝尯鍒?
璇昏呬篃璁鎬細(xì)闂紝濡傛灉涓涓ぇ紼嬪簭鍦ㄨ繍琛屼腑錛屽畠鐨勬暟鎹鍜屽爢鏍堥兘寰堝ぇ錛屼竴嬈ork灝辮澶嶅埗涓嬈★紝閭d箞fork鐨勭郴緇熷紑閿涓嶆槸寰堝ぇ鍚楋紵鍏跺疄UNIX鑷湁鍏惰В鍐?
鐨勫姙娉曪紝澶у鐭ラ亾錛屼竴鑸珻PU閮芥槸浠?欏?涓哄崟浣嶆潵鍒嗛厤鍐呭瓨絀洪棿鐨勶紝姣忎竴涓〉閮芥槸瀹為檯鐗╃悊鍐呭瓨鐨勪竴涓槧鍍忥紝璞NTEL鐨凜PU錛屽叾涓欏靛湪閫氬父鎯呭喌涓嬫槸
4086瀛楄妭澶у皬錛岃屾棤璁烘槸鏁版嵁孌佃繕鏄爢鏍堟閮芥槸鐢辮澶?欏?鏋勬垚鐨勶紝fork鍑芥暟澶嶅埗榪欎袱涓錛屽彧鏄?閫昏緫"涓婄殑錛屽茍闈?鐗╃悊"涓婄殑錛屼篃灝辨槸璇達(dá)紝瀹為檯鎵?
琛宖ork鏃訛紝鐗╃悊絀洪棿涓婁袱涓繘紼嬬殑鏁版嵁孌靛拰鍫嗘爤孌甸兘榪樻槸鍏變韓鐫鐨勶紝褰撴湁涓涓繘紼嬪啓浜?jiǎn)鏌愪釜鏁版嵁鏃跺Q岃繖鏃朵袱涓繘紼嬩箣闂寸殑鏁版嵁鎵嶆湁浜?jiǎn)鍖哄埆锛尵p葷粺灝卞皢鏈夊尯鍒殑"
欏?浠庣墿鐞嗕笂涔熷垎寮銆傜郴緇熷湪絀洪棿涓婄殑寮閿灝卞彲浠ヨ揪鍒版渶灝忋? 銆銆 涓嬮潰婕旂ず涓涓凍浠?鎼炴"Linux鐨勫皬紼嬪簭錛屽叾婧愪唬鐮侀潪甯哥畝鍗曪細(xì) 銆銆 void main() 銆銆 { 銆銆銆銆 for( ; ; ) fork(); 銆銆 }
榪欎釜紼嬪簭浠涔堜篃涓嶅仛錛屽氨鏄寰幆鍦癴ork錛屽叾緇撴灉鏄▼搴忎笉鏂駭鐢熻繘紼嬶紝鑰岃繖浜涜繘紼嬪張涓嶆柇浜х敓鏂扮殑榪涚▼錛屽緢蹇紝緋葷粺鐨勮繘紼嬪氨婊′簡(jiǎn)錛岀郴緇熷氨琚繖涔堝涓嶆柇浜х敓
鐨勮繘紼?鎾戞浜?銆傚綋鐒跺彧瑕佺郴緇熺鐞嗗憳棰勫厛緇欐瘡涓敤鎴瘋緗彲榪愯鐨勬渶澶ц繘紼嬫暟錛岃繖涓伓鎰忕殑紼嬪簭灝卞畬鎴愪笉浜?jiǎn)浼佸浘浜?jiǎn)銆? 銆銆 2.2.2 exec( )鍑芥暟鏃?
涓嬮潰鎴戜滑鏉ョ湅鐪嬩竴涓繘紼嬪浣曟潵鍚姩鍙︿竴涓▼搴忕殑鎵ц銆傚湪Linux涓浣跨敤exec鍑芥暟鏃忋傜郴緇熻皟鐢╡xecve錛堬級(jí)瀵瑰綋鍓嶈繘紼嬭繘琛屾浛鎹紝鏇挎崲鑰呬負(fù)涓涓寚
瀹氱殑紼嬪簭錛屽叾鍙傛暟鍖呮嫭鏂囦歡鍚嶏紙filename錛夈佸弬鏁板垪琛紙argv錛変互鍙?qiáng)鐜鍙橀噺锛坋nvp錛夈俥xec鍑芥暟鏃忓綋鐒朵笉姝竴涓紝浣嗗畠浠ぇ鑷寸浉鍚岋紝鍦?
Linux涓紝瀹冧滑鍒嗗埆鏄細(xì)execl錛宔xeclp錛宔xecle錛宔xecv錛宔xecve鍜宔xecvp錛屼笅闈㈡垜鍙互execlp涓轟緥錛屽叾瀹冨嚱鏁扮┒
绔熶笌execlp鏈変綍鍖哄埆錛岃閫氳繃manexec鍛戒護(hù)鏉ヤ簡(jiǎn)瑙e畠浠殑鍏蜂綋鎯呭喌銆?
涓涓繘紼嬩竴鏃﹁皟鐢╡xec綾誨嚱鏁幫紝瀹冩湰韜氨"姝諱骸"浜?jiǎn)锛尵p葷粺鎶婁唬鐮佹鏇挎崲鎴愭柊鐨勭▼搴忕殑浠g爜錛屽簾寮冨師鏈夌殑鏁版嵁孌靛拰鍫嗘爤孌碉紝騫朵負(fù)鏂扮▼搴忓垎閰嶆柊鐨勬暟鎹涓庡爢鏍?
孌碉紝鍞竴鐣欎笅鐨勶紝灝辨槸榪涚▼鍙鳳紝涔熷氨鏄錛屽緋葷粺鑰岃█錛岃繕鏄悓涓涓繘紼嬶紝涓嶈繃宸茬粡鏄彟涓涓▼搴忎簡(jiǎn)銆傦紙涓嶈繃exec綾誨嚱鏁頒腑鏈夌殑榪樺厑璁哥戶鎵跨幆澧冨彉閲忎箣綾葷殑淇?
鎭傦級(jí) 銆銆 閭d箞濡傛灉鎴戠殑紼嬪簭鎯沖惎鍔ㄥ彟涓紼嬪簭鐨勬墽琛屼絾鑷繁浠嶆兂緇х畫榪愯鐨勮瘽錛屾庝箞鍔炲憿錛熼偅灝辨槸緇撳悎fork涓巈xec鐨勪嬌鐢ㄣ備笅闈竴孌典唬鐮佹樉紺哄浣曞惎鍔ㄨ繍琛屽叾瀹冪▼搴忥細(xì) char command[256]; void main() { int rtn; /*瀛愯繘紼嬬殑榪斿洖鏁板?/ while(1) { /* 浠庣粓绔鍙栬鎵ц鐨勫懡浠?*/ printf( ">" ); fgets( command, 256, stdin ); command[strlen(command)-1] = 0; if ( fork() == 0 ) { /* 瀛愯繘紼嬫墽琛屾鍛戒護(hù) */ execlp( command, command ); /* 濡傛灉exec鍑芥暟榪斿洖錛岃〃鏄庢病鏈夋甯告墽琛屽懡浠わ紝鎵撳嵃閿欒淇℃伅*/ perror( command ); exit( errorno ); } else { /* 鐖惰繘紼嬶紝 絳夊緟瀛愯繘紼嬬粨鏉燂紝騫舵墦鍗板瓙榪涚▼鐨勮繑鍥炲?*/ wait ( &rtn ); printf( " child process return %d\n",. rtn ); } } }
姝ょ▼搴忎粠緇堢璇誨叆鍛戒護(hù)騫舵墽琛屼箣錛屾墽琛屽畬鎴愬悗錛岀埗榪涚▼緇х畫絳夊緟浠庣粓绔鍏ュ懡浠ゃ傜啛鎮(zhèn)塂OS鍜學(xué)INDOWS緋葷粺璋冪敤鐨勬湅鍙嬩竴瀹氱煡閬揇OS/WINDOWS涔?
鏈塭xec綾誨嚱鏁幫紝鍏朵嬌鐢ㄦ柟娉曟槸綾諱技鐨勶紝浣咲OS/WINDOWS榪樻湁spawn綾誨嚱鏁幫紝鍥犱負(fù)DOS鏄崟浠誨姟鐨勭郴緇燂紝瀹冨彧鑳藉皢"鐖惰繘紼?椹葷暀鍦ㄦ満鍣ㄥ唴鍐嶆墽
琛?瀛愯繘紼?錛岃繖灝辨槸spawn綾葷殑鍑芥暟銆俉IN32宸茬粡鏄浠誨姟鐨勭郴緇熶簡(jiǎn)錛屼絾榪樹繚鐣欎簡(jiǎn)spawn綾誨嚱鏁幫紝W(xué)IN32涓疄鐜皊pawn鍑芥暟鐨勬柟娉曞悓鍓嶈堪
UNIX涓殑鏂規(guī)硶宸笉澶氾紝寮璁懼瓙榪涚▼鍚庣埗榪涚▼絳夊緟瀛愯繘紼嬬粨鏉熷悗鎵嶇戶緇繍琛屻俇NIX鍦ㄥ叾涓寮濮嬪氨鏄浠誨姟鐨勭郴緇燂紝鎵浠ヤ粠鏍稿績(jī)瑙掑害涓婅涓嶉渶瑕乻pawn綾誨嚱
鏁般?
鍦ㄨ繖涓鑺傞噷錛屾垜浠繕瑕佽璁瞫ystem錛堬級(jí)鍜宲open錛堬級(jí)鍑芥暟銆俿ystem錛堬級(jí)鍑芥暟鍏堣皟鐢╢ork錛堬級(jí)錛岀劧鍚庡啀璋冪敤exec錛堬級(jí)鏉ユ墽琛岀敤鎴風(fēng)殑鐧誨綍
shell錛岄氳繃瀹冩潵鏌ユ壘鍙墽琛屾枃浠剁殑鍛戒護(hù)騫跺垎鏋愬弬鏁幫紝鏈鍚庡畠涔堜嬌鐢╳ait錛堬級(jí)鍑芥暟鏃忎箣涓鏉ョ瓑寰呭瓙榪涚▼鐨勭粨鏉熴傚嚱鏁皃open錛堬級(jí)鍜屽嚱鏁?
system錛堬級(jí)鐩鎬技錛屼笉鍚岀殑鏄畠璋冪敤pipe錛堬級(jí)鍑芥暟鍒涘緩涓涓閬擄紝閫氳繃瀹冩潵瀹屾垚紼嬪簭鐨勬爣鍑嗚緭鍏ュ拰鏍囧噯杈撳嚭銆傝繖涓や釜鍑芥暟鏄負(fù)閭d簺涓嶅お鍕ゅ揩鐨勭▼搴忓憳璁捐
鐨勶紝鍦ㄦ晥鐜囧拰瀹夊叏鏂歸潰閮芥湁鐩稿綋鐨勭己闄鳳紝鍦ㄥ彲鑳界殑鎯呭喌涓嬶紝搴旇灝介噺閬垮厤銆? 銆 2.3 Linux涓嬬殑榪涚▼闂撮氫俊
璇︾粏鐨勮榪拌繘紼嬮棿閫氫俊鍦ㄨ繖閲岀粷瀵規(guī)槸涓嶅彲鑳界殑浜嬫儏錛岃屼笖絎旇呭緢闅炬湁淇″績(jī)璇磋嚜宸卞榪欎竴閮ㄥ垎鍐呭鐨勮璇嗚揪鍒頒簡(jiǎn)浠涔堟牱鐨勫湴姝ワ紝鎵浠ュ湪榪欎竴鑺傜殑寮澶撮鍏堝悜澶у鎺ㄨ崘钁?
鍚嶄綔鑰匯ichard Stevens鐨勮憲鍚嶄綔鍝侊細(xì)銆夾dvanced Programming in the UNIX
Environment銆嬶紝瀹冪殑涓枃璇戞湰銆奤NIX鐜楂樼駭緙栫▼銆嬪凡鏈夋満姊板伐涓氬嚭鐗堢ぞ鍑虹増錛屽師鏂囩簿褰╋紝璇戞枃鍚屾牱鍦伴亾錛屽鏋滀綘鐨勭‘瀵瑰湪Linux涓嬬紪紼嬫湁嫻?
鍘氱殑鍏磋叮錛岄偅涔堣刀绱у皢榪欐湰涔︽憜鍒頒綘鐨勪功妗屼笂鎴栬綆楁満鏃佽竟鏉ャ傝榪欎箞澶氬疄鍦ㄦ槸闅炬姂蹇?jī)涓殑鏅活C箣鎯咃紝璦褰掓浼狅紝鍦ㄨ繖涓鑺傞噷錛屾垜浠皢浠嬬粛榪涚▼闂撮氫俊鏈鏈鍒濇鍜屾渶
鏈綆鍗曠殑涓浜涚煡璇嗗拰姒傚康銆?
棣栧厛錛岃繘紼嬮棿閫氫俊鑷沖皯鍙互閫氳繃浼犻佹墦寮鏂囦歡鏉ュ疄鐜幫紝涓嶅悓鐨勮繘紼嬮氳繃涓涓垨澶氫釜鏂囦歡鏉ヤ紶閫掍俊鎭紝浜嬪疄涓婏紝鍦ㄥ緢澶氬簲鐢ㄧ郴緇熼噷錛岄兘浣跨敤浜?jiǎn)杩櫩U嶆柟娉曘備絾涓鑸鏉ワ紝
榪涚▼闂撮氫俊錛圛PC錛欼nterProcess
Communication錛変笉鍖呮嫭榪欑浼間箮姣旇緝浣庣駭鐨勯氫俊鏂規(guī)硶銆俇nix緋葷粺涓疄鐜拌繘紼嬮棿閫氫俊鐨勬柟娉曞緢澶氾紝鑰屼笖涓嶅垢鐨勬槸錛屾瀬灝戞柟娉曡兘鍦ㄦ墍鏈夌殑Unix緋?
緇熶腑榪涜縐繪錛堝敮涓涓縐嶆槸鍗婂弻宸ョ殑綆¢亾錛岃繖涔熸槸鏈鍘熷鐨勪竴縐嶉氫俊鏂瑰紡錛夈傝孡inux浣滀負(fù)涓縐嶆柊鍏寸殑鎿嶄綔緋葷粺錛屽嚑涔庢敮鎸佹墍鏈夌殑Unix涓嬪父鐢ㄧ殑榪涚▼闂撮氫俊
鏂規(guī)硶錛氱閬撱佹秷鎭槦鍒椼佸叡浜唴瀛樸佷俊鍙烽噺銆佸鎺ュ彛絳夌瓑銆備笅闈㈡垜浠皢閫愪竴浠嬬粛銆? 銆銆 2.3.1 綆¢亾 銆銆 綆¢亾鏄繘紼嬮棿閫氫俊涓渶鍙よ佺殑鏂瑰紡錛屽畠鍖呮嫭鏃犲悕綆¢亾鍜屾湁鍚嶇閬撲袱縐嶏紝鍓嶈呯敤浜庣埗榪涚▼鍜屽瓙榪涚▼闂寸殑閫氫俊錛屽悗鑰呯敤浜庤繍琛屼簬鍚屼竴鍙版満鍣ㄤ笂鐨勪換鎰忎袱涓繘紼嬮棿鐨勯氫俊銆? 銆銆 鏃犲悕綆¢亾鐢眕ipe錛堬級(jí)鍑芥暟鍒涘緩錛? 銆銆 #include <unistd.h> 銆銆 int pipe(int filedis[2])錛? 銆銆 鍙傛暟filedis榪斿洖涓や釜鏂囦歡鎻忚堪絎︼細(xì)filedes[0]涓鴻鑰屾墦寮錛宖iledes[1]涓哄啓鑰屾墦寮銆俧iledes[1]鐨勮緭鍑烘槸filedes[0]鐨勮緭鍏ャ備笅闈㈢殑渚嬪瓙紺鴻寖浜?jiǎn)濡備綍鍦ㄧ埗杩浗E嬪拰瀛愯繘紼嬮棿瀹炵幇閫氫俊銆? #define INPUT 0 #define OUTPUT 1 void main() { int file_descriptors[2]; /*瀹氫箟瀛愯繘紼嬪彿 */ pid_t pid; char buf[256]; int returned_count; /*鍒涘緩鏃犲悕綆¢亾*/ pipe(file_descriptors); /*鍒涘緩瀛愯繘紼?/ if((pid = fork()) == -1) { printf("Error in fork\n"); exit(1); } /*鎵ц瀛愯繘紼?/ if(pid == 0) { printf("in the spawned (child) process...\n"); /*瀛愯繘紼嬪悜鐖惰繘紼嬪啓鏁版嵁錛屽叧闂閬撶殑璇葷*/ close(file_descriptors[INPUT]); write(file_descriptors[OUTPUT], "test data", strlen("test data")); exit(0); } else { /*鎵ц鐖惰繘紼?/ printf("in the spawning (parent) process...\n"); /*鐖惰繘紼嬩粠綆¢亾璇誨彇瀛愯繘紼嬪啓鐨勬暟鎹紝鍏抽棴綆¢亾鐨勫啓绔?/ close(file_descriptors[OUTPUT]); returned_count = read(file_descriptors[INPUT], buf, sizeof(buf)); printf("%d bytes of data received from spawned process: %s\n", returned_count, buf); } } 鍦↙inux緋葷粺涓嬶紝鏈夊悕綆¢亾鍙敱涓ょ鏂瑰紡鍒涘緩錛氬懡浠よ鏂瑰紡mknod緋葷粺璋冪敤鍜屽嚱鏁癿kfifo銆備笅闈㈢殑涓ょ閫斿緞閮藉湪褰撳墠鐩綍涓嬬敓鎴愪簡(jiǎn)涓涓悕涓簃yfifo鐨勬湁鍚嶇閬擄細(xì) 銆銆銆銆 鏂瑰紡涓錛歮kfifo("myfifo","rw"); 銆銆銆銆 鏂瑰紡浜岋細(xì)mknod myfifo p 銆銆 鐢熸垚浜?jiǎn)鏈夊悕绠¢亾鍚庡Q屽氨鍙互浣跨敤涓鑸殑鏂囦歡I/O鍑芥暟濡俹pen銆乧lose銆乺ead銆亀rite絳夋潵瀵瑰畠榪涜鎿嶄綔銆備笅闈㈠嵆鏄竴涓畝鍗曠殑渚嬪瓙錛屽亣璁炬垜浠凡緇忓垱寤轟簡(jiǎn)涓涓悕涓簃yfifo鐨勬湁鍚嶇閬撱? 銆 /* 榪涚▼涓錛氳鏈夊悕綆¢亾*/ #include <stdio.h> #include <unistd.h> void main() { FILE * in_file; int count = 1; char buf[80]; in_file = fopen("mypipe", "r"); if (in_file == NULL) { printf("Error in fdopen.\n"); exit(1); } while ((count = fread(buf, 1, 80, in_file)) > 0) printf("received from pipe: %s\n", buf); fclose(in_file); } 銆 /* 榪涚▼浜岋細(xì)鍐欐湁鍚嶇閬?/ #include <stdio.h> #include <unistd.h> void main() { FILE * out_file; int count = 1; char buf[80]; out_file = fopen("mypipe", "w"); if (out_file == NULL) { printf("Error opening pipe."); exit(1); } sprintf(buf,"this is test data for the named pipe example\n"); fwrite(buf, 1, 80, out_file); fclose(out_file); } 銆銆 2.3.2 娑堟伅闃熷垪 銆銆 娑堟伅闃熷垪鐢ㄤ簬榪愯浜庡悓涓鍙版満鍣ㄤ笂鐨勮繘紼嬮棿閫氫俊錛屽畠鍜岀閬撳緢鐩鎬技錛屼簨瀹炰笂錛屽畠鏄竴縐嶆閫愭笎琚窐姹扮殑閫氫俊鏂瑰紡錛屾垜浠彲浠ョ敤嫻佺閬撴垨鑰呭鎺ュ彛鐨勬柟寮忔潵鍙栦唬瀹冿紝鎵浠ワ紝鎴戜滑瀵規(guī)鏂瑰紡涔熶笉鍐嶈В閲婏紝涔熷緩璁鑰呭拷鐣ヨ繖縐嶆柟寮忋? 銆銆 2.3.3 鍏變韓鍐呭瓨
鍏變韓鍐呭瓨鏄繍琛屽湪鍚屼竴鍙版満鍣ㄤ笂鐨勮繘紼嬮棿閫氫俊鏈蹇殑鏂瑰紡錛屽洜涓烘暟鎹笉闇瑕佸湪涓嶅悓鐨勮繘紼嬮棿澶嶅埗銆傞氬父鐢變竴涓繘紼嬪垱寤轟竴鍧楀叡浜唴瀛樺尯錛屽叾浣欒繘紼嬪榪欏潡鍐呭瓨鍖鴻繘琛?
璇誨啓銆傚緱鍒板叡浜唴瀛樻湁涓ょ鏂瑰紡錛氭槧灝?dev/mem璁懼鍜屽唴瀛樻槧鍍忔枃浠躲傚墠涓縐嶆柟寮忎笉緇欑郴緇熷甫鏉ラ澶栫殑寮閿錛屼絾鍦ㄧ幇瀹炰腑騫朵笉甯哥敤錛屽洜涓哄畠鎺у埗瀛樺彇鐨勫皢鏄?
瀹為檯鐨勭墿鐞嗗唴瀛橈紝鍦↙inux緋葷粺涓嬶紝榪欏彧鏈夐氳繃闄愬埗Linux緋葷粺瀛樺彇鐨勫唴瀛樻墠鍙互鍋氬埌錛岃繖褰撶劧涓嶅お瀹為檯銆傚父鐢ㄧ殑鏂瑰紡鏄氳繃shmXXX鍑芥暟鏃忔潵瀹炵幇鍒?
鐢ㄥ叡浜唴瀛樿繘琛屽瓨鍌ㄧ殑銆? 銆銆 棣栧厛瑕佺敤鐨勫嚱鏁版槸shmget錛屽畠鑾峰緱涓涓叡浜瓨鍌ㄦ爣璇嗙銆? 銆銆銆銆 #include <sys/types.h> 銆銆銆銆 #include <sys/ipc.h> 銆銆銆銆 #include <sys/shm.h> 銆銆銆銆銆 int shmget(key_t key, int size, int flag);
榪欎釜鍑芥暟鏈夌偣綾諱技澶у鐔熸?zhèn)夌殑malloc鍑芥暟錛岀郴緇熸寜鐓ц姹傚垎閰峴ize澶у皬鐨勫唴瀛樼敤浣滃叡浜唴瀛樸侺inux緋葷粺鍐呮牳涓瘡涓狪PC緇撴瀯閮芥湁鐨勪竴涓潪璐熸暣鏁?
鐨勬爣璇嗙錛岃繖鏍峰涓涓秷鎭槦鍒楀彂閫佹秷鎭椂鍙寮曠敤鏍囪瘑絎﹀氨鍙互浜?jiǎn)銆傝繖涓爣璇嗙鏄唴鏍哥敱IPC緇撴瀯鐨勫叧閿瓧寰楀埌鐨勶紝榪欎釜鍏抽敭瀛楋紝灝辨槸涓婇潰絎竴涓嚱鏁扮殑
key銆傛暟鎹被鍨媖ey_t鏄湪澶存枃浠秙ys/types.h涓畾涔夌殑錛屽畠鏄竴涓暱鏁村艦鐨勬暟鎹傚湪鎴戜滑鍚庨潰鐨勭珷鑺備腑錛岃繕浼?xì)纰板埌杩欎釜鍏抽敭瀛椼? 銆銆 褰撳叡浜唴瀛樺垱寤哄悗錛屽叾浣欒繘紼嬪彲浠ヨ皟鐢╯hmat錛堬級(jí)灝嗗叾榪炴帴鍒拌嚜韜殑鍦板潃絀洪棿涓? 銆銆 void *shmat(int shmid, void *addr, int flag); 銆銆 shmid涓簊hmget鍑芥暟榪斿洖鐨勫叡浜瓨鍌ㄦ爣璇嗙錛宎ddr鍜宖lag鍙傛暟鍐沖畾浜?jiǎn)浠ヤ粈涔堟柟寮忔潵紜畾榪炴帴鐨勫湴鍧錛屽嚱鏁扮殑榪斿洖鍊煎嵆鏄榪涚▼鏁版嵁孌墊墍榪炴帴鐨勫疄闄呭湴鍧錛岃繘紼嬪彲浠ュ姝よ繘紼嬭繘琛岃鍐欐搷浣溿?
浣跨敤鍏變韓瀛樺偍鏉ュ疄鐜拌繘紼嬮棿閫氫俊鐨勬敞鎰忕偣鏄鏁版嵁瀛樺彇鐨勫悓姝ワ紝蹇呴』紜繚褰撲竴涓繘紼嬪幓璇誨彇鏁版嵁鏃訛紝瀹冩墍鎯寵鐨勬暟鎹凡緇忓啓濂戒簡(jiǎn)銆傞氬父錛屼俊鍙烽噺琚鏉ュ疄鐜板鍏變韓瀛?
鍌ㄦ暟鎹瓨鍙栫殑鍚屾錛屽彟澶栵紝鍙互閫氳繃浣跨敤shmctl鍑芥暟璁劇疆鍏變韓瀛樺偍鍐呭瓨鐨勬煇浜涙爣蹇椾綅濡係HM_LOCK銆丼HM_UNLOCK絳夋潵瀹炵幇銆? 銆銆 2.3.4 淇″彿閲? 銆銆 淇″彿閲忓張縐頒負(fù)淇″彿鐏紝瀹冩槸鐢ㄦ潵鍗忚皟涓嶅悓榪涚▼闂寸殑鏁版嵁瀵硅薄鐨勶紝鑰屾渶涓昏鐨勫簲鐢ㄦ槸鍓嶄竴鑺傜殑鍏變韓鍐呭瓨鏂瑰紡鐨勮繘紼嬮棿閫氫俊銆傛湰璐ㄤ笂錛屼俊鍙烽噺鏄竴涓鏁板櫒錛屽畠鐢ㄦ潵璁板綍瀵規(guī)煇涓祫婧愶紙濡傚叡浜唴瀛橈級(jí)鐨勫瓨鍙栫姸鍐點(diǎn)備竴鑸鏉ワ紝涓轟簡(jiǎn)鑾峰緱鍏變韓璧勬簮錛岃繘紼嬮渶瑕佹墽琛屼笅鍒楁搷浣滐細(xì) 銆銆 錛?錛?嫻嬭瘯鎺у埗璇ヨ祫婧愮殑淇″彿閲忋? 銆銆 錛?錛?鑻ユ淇″彿閲忕殑鍊間負(fù)姝o紝鍒欏厑璁歌繘琛屼嬌鐢ㄨ璧勬簮銆傝繘紼嬪皢榪涘彿閲忓噺1銆? 銆銆 錛?錛?鑻ユ淇″彿閲忎負(fù)0錛屽垯璇ヨ祫婧愮洰鍓嶄笉鍙敤錛岃繘紼嬭繘鍏ョ潯鐪犵姸鎬侊紝鐩磋嚦淇″彿閲忓煎ぇ浜?錛岃繘紼嬭鍞ら啋錛岃漿鍏ユ楠わ紙1錛夈? 銆銆 錛?錛?褰撹繘紼嬩笉鍐嶄嬌鐢ㄤ竴涓俊鍙烽噺鎺у埗鐨勮祫婧愭椂錛屼俊鍙烽噺鍊煎姞1銆傚鏋滄鏃舵湁榪涚▼姝e湪鐫$湢絳夊緟姝や俊鍙烽噺錛屽垯鍞ら啋姝よ繘紼嬨?
緇存姢淇″彿閲忕姸鎬佺殑鏄疞inux鍐呮牳鎿嶄綔緋葷粺鑰屼笉鏄敤鎴瘋繘紼嬨傛垜浠彲浠ヤ粠澶存枃浠?usr/src/linux/include銆/linux銆/sem.h
涓湅鍒板唴鏍哥敤鏉ョ淮鎶や俊鍙烽噺鐘舵佺殑鍚勪釜緇撴瀯鐨勫畾涔夈備俊鍙烽噺鏄竴涓暟鎹泦鍚堬紝鐢ㄦ埛鍙互鍗曠嫭浣跨敤榪欎竴闆嗗悎鐨勬瘡涓厓绱犮傝璋冪敤鐨勭涓涓嚱鏁版槸semget錛岀敤浠ヨ幏
寰椾竴涓俊鍙烽噺ID銆? 銆銆 #include <sys/types.h> 銆銆 #include <sys/ipc.h> 銆銆 #include <sys/sem.h> 銆銆 int semget(key_t key, int nsems, int flag);
key鏄墠闈㈣榪囩殑IPC緇撴瀯鐨勫叧閿瓧錛屽畠?yōu)畣鏉ュ啗_畾鏄垱寤烘柊鐨勪俊鍙烽噺闆嗗悎錛岃繕鏄紩鐢ㄤ竴涓幇鏈夌殑淇″彿閲忛泦鍚堛俷sems鏄闆嗗悎涓殑淇″彿閲忔暟銆傚鏋滄槸鍒涘緩鏂?
闆嗗悎錛堜竴鑸湪鏈嶅姟鍣ㄤ腑錛夛紝鍒欏繀欏繪寚瀹歯sems錛涘鏋滄槸寮曠敤涓涓幇鏈夌殑淇″彿閲忛泦鍚堬紙涓鑸湪瀹㈡埛鏈轟腑錛夊垯灝唍sems鎸囧畾涓?銆? 銆銆 semctl鍑芥暟鐢ㄦ潵瀵逛俊鍙烽噺榪涜鎿嶄綔銆? 銆銆 int semctl(int semid, int semnum, int cmd, union semun arg); 銆銆 涓嶅悓鐨勬搷浣滄槸閫氳繃cmd鍙傛暟鏉ュ疄鐜扮殑錛屽湪澶存枃浠秙em.h涓畾涔変簡(jiǎn)7縐嶄笉鍚岀殑鎿嶄綔錛屽疄闄呯紪紼嬫椂鍙互鍙傜収浣跨敤銆? 銆銆 semop鍑芥暟鑷姩鎵ц淇″彿閲忛泦鍚堜笂鐨勬搷浣滄暟緇勩? 銆銆 int semop(int semid, struct sembuf semoparray[], size_t nops); 銆銆 semoparray鏄竴涓寚閽堬紝瀹冩寚鍚戜竴涓俊鍙烽噺鎿嶄綔鏁扮粍銆俷ops瑙勫畾璇ユ暟緇勪腑鎿嶄綔鐨勬暟閲忋? 銆銆 涓嬮潰錛屾垜浠湅涓涓叿浣撶殑渚嬪瓙錛屽畠鍒涘緩涓涓壒瀹氱殑IPC緇撴瀯鐨勫叧閿瓧鍜屼竴涓俊鍙烽噺錛屽緩绔嬫淇″彿閲忕殑绱㈠紩錛屼慨鏀圭儲(chǔ)寮曟寚鍚戠殑淇″彿閲忕殑鍊鹼紝鏈鍚庢垜浠竻闄や俊鍙烽噺銆傚湪涓嬮潰鐨勪唬鐮佷腑錛屽嚱鏁癴tok鐢熸垚鎴戜滑涓婃枃鎵璇寸殑鍞竴鐨処PC鍏抽敭瀛椼? #include <stdio.h> #include <sys/types.h> #include <sys/sem.h> #include <sys/ipc.h> void main() { key_t unique_key; /* 瀹氫箟涓涓狪PC鍏抽敭瀛?/ int id; struct sembuf lock_it; union semun options; int i; unique_key = ftok(".", 'a'); /* 鐢熸垚鍏抽敭瀛楋紝瀛楃'a'鏄竴涓殢鏈虹瀛?/ /* 鍒涘緩涓涓柊鐨勪俊鍙烽噺闆嗗悎*/ id = semget(unique_key, 1, IPC_CREAT | IPC_EXCL | 0666); printf("semaphore id=%d\n", id); options.val = 1; /*璁劇疆鍙橀噺鍊?/ semctl(id, 0, SETVAL, options); /*璁劇疆绱㈠紩0鐨勪俊鍙烽噺*/ /*鎵撳嵃鍑轟俊鍙烽噺鐨勫?/ i = semctl(id, 0, GETVAL, 0); printf("value of semaphore at index 0 is %d\n", i); /*涓嬮潰閲嶆柊璁劇疆淇″彿閲?/ lock_it.sem_num = 0; /*璁劇疆鍝釜淇″彿閲?/ lock_it.sem_op = -1; /*瀹氫箟鎿嶄綔*/ lock_it.sem_flg = IPC_NOWAIT; /*鎿嶄綔鏂瑰紡*/ if (semop(id, &lock_it, 1) == -1) { printf("can not lock semaphore.\n"); exit(1); } i = semctl(id, 0, GETVAL, 0); printf("value of semaphore at index 0 is %d\n", i); /*娓呴櫎淇″彿閲?/ semctl(id, 0, IPC_RMID, 0); } 銆銆 2.3.5 濂楁帴鍙?
濂楁帴鍙o紙socket錛夌紪紼嬫槸瀹炵幇Linux緋葷粺鍜屽叾浠栧ぇ澶氭暟鎿嶄綔緋葷粺涓繘紼嬮棿閫氫俊鐨勪富瑕佹柟寮忎箣涓銆傛垜浠啛鐭ョ殑WWW鏈嶅姟銆丗TP鏈嶅姟銆乀ELNET鏈嶅姟
絳夐兘鏄熀浜庡鎺ュ彛緙栫▼鏉ュ疄鐜扮殑銆傞櫎浜?jiǎn)鍦ㄥ紓鍦扮殑璁〗帡鏈簶q涚▼闂翠互澶栵紝濂楁帴鍙e悓鏍烽傜敤浜庢湰鍦板悓涓鍙拌綆楁満鍐呴儴鐨勮繘紼嬮棿閫氫俊銆傚叧浜庡鎺ュ彛鐨勭粡鍏告暀鏉愬悓鏍鋒槸
Richard
Stevens緙栬憲鐨勩奤nix緗戠粶緙栫▼錛氳仈緗戠殑API鍜屽鎺ュ瓧銆嬶紝娓呭崕澶у鍑虹増紺懼嚭鐗堜簡(jiǎn)璇ヤ功鐨勫獎(jiǎng)鍗扮増銆傚畠鍚屾牱鏄疞inux紼嬪簭鍛樼殑蹇呭涔︾睄涔嬩竴銆?
鍏充簬榪欎竴閮ㄥ垎鐨勫唴瀹癸紝鍙互鍙傜収鏈枃浣滆呯殑鍙︿竴綃囨枃绔犮婅璁¤嚜宸辯殑緗戠粶铓傝殎銆嬶紝閭i噷鐢卞父鐢ㄧ殑鍑犱釜濂楁帴鍙e嚱鏁扮殑浠嬬粛鍜岀ず渚嬬▼搴忋傝繖涓閮ㄥ垎鎴栬鏄疞inux榪涚▼
闂撮氫俊緙栫▼涓渶欏誨叧娉ㄥ拰鏈鍚稿紩浜虹殑涓閮ㄥ垎錛屾瘯绔燂紝Internet
姝e湪鎴戜滑韜竟浠ヤ笉鍙濊鐨勯熷害鍙戝睍鐫錛屽鏋滀竴涓▼搴忓憳鍦ㄨ璁$紪鍐欎粬涓嬩竴涓▼搴忕殑鏃跺欙紝鏍規(guī)湰娌℃湁鑰冭檻鍒扮綉緇滐紝鑰冭檻鍒癐nternet錛岄偅涔堬紝鍙互璇達(dá)紝浠栫殑璁?
璁″緢闅炬垚鍔熴? 3 Linux鐨勮繘紼嬪拰W(xué)in32鐨勮繘紼?綰跨▼姣旇緝 銆銆 鐔熸?zhèn)塛IN32緙栫▼鐨勪漢涓瀹氱煡閬擄紝W(xué)IN32鐨勮繘紼嬬鐞嗘柟寮忎笌Linux涓婃湁鐫寰堝ぇ鍖哄埆錛屽湪UNIX閲岋紝鍙湁榪涚▼鐨勬蹇碉紝浣嗗湪WIN32閲屽嵈榪樻湁涓涓?綰跨▼"鐨勬蹇碉紝閭d箞Linux鍜學(xué)IN32鍦ㄨ繖閲岀┒绔熸湁鐫浠涔堝尯鍒憿錛?
WIN32閲岀殑榪涚▼/綰跨▼鏄戶鎵胯嚜OS/2鐨勩傚湪WIN32閲岋紝"榪涚▼"鏄寚涓涓▼搴忥紝鑰?綰跨▼"鏄竴涓?榪涚▼"閲岀殑涓涓墽琛?綰跨儲(chǔ)"銆備粠鏍稿績(jī)涓?
璁詫紝W(xué)IN32鐨勫榪涚▼涓嶭inux騫舵棤澶氬ぇ鐨勫尯鍒紝鍦╓IN32閲岀殑綰跨▼鎵嶇浉褰撲簬Linux鐨勮繘紼嬶紝鏄竴涓疄闄呮鍦ㄦ墽琛岀殑浠g爜銆備絾鏄紝W(xué)IN32閲屽悓涓
涓繘紼嬮噷鍚勪釜綰跨▼涔嬮棿鏄叡浜暟鎹鐨勩傝繖鎵嶆槸涓嶭inux鐨勮繘紼嬫渶澶х殑涓嶅悓銆? 銆銆 涓嬮潰榪欐紼嬪簭鏄劇ず浜?jiǎn)WIN32涓嬩竴涓繘紼嬪浣曞惎鍔ㄤ竴涓嚎紼嬨? int g; DWORD WINAPI ChildProcess( LPVOID lpParameter ){ int i; for ( i = 1; i <1000; i ++) { g ++; printf( "This is Child Thread: %d\n", g ); } ExitThread( 0 ); }; void main() { int threadID; int i; g = 0; CreateThread( NULL, 0, ChildProcess, NULL, 0, &threadID ); for ( i = 1; i <1000; i ++) { g ++; printf( "This is Parent Thread: %d\n", g ); } }
鍦╓IN32涓嬶紝浣跨敤CreateThread鍑芥暟鍒涘緩綰跨▼錛屼笌Linux涓嬪垱寤鴻繘紼嬩笉鍚岋紝W(xué)IN32綰跨▼涓嶆槸浠庡垱寤哄寮濮嬭繍琛岀殑錛岃屾槸鐢?
CreateThread鎸囧畾涓涓嚱鏁幫紝綰跨▼灝變粠閭d釜鍑芥暟澶勫紑濮嬭繍琛屻傛紼嬪簭鍚屽墠闈㈢殑UNIX紼嬪簭涓鏍鳳紝鐢變袱涓嚎紼嬪悇鎵撳嵃1000鏉′俊鎭?
threadID鏄瓙綰跨▼鐨勭嚎紼嬪彿錛屽彟澶栵紝鍏ㄥ眬鍙橀噺g鏄瓙綰跨▼涓庣埗綰跨▼鍏變韓鐨勶紝榪欏氨鏄笌Linux鏈澶х殑涓嶅悓涔嬪銆傚ぇ瀹跺彲浠ョ湅鍑猴紝W(xué)IN32鐨勮繘紼?綰跨▼
瑕佹瘮Linux澶嶆潅錛屽湪Linux瑕佸疄鐜扮被浼糤IN32鐨勭嚎紼嬪茍涓嶉毦錛屽彧瑕乫ork浠ュ悗錛岃瀛愯繘紼嬭皟鐢═hreadProc鍑芥暟錛屽茍涓斾負(fù)鍏ㄥ眬鍙橀噺寮璁懼叡浜?
鏁版嵁鍖哄氨琛屼簡(jiǎn)錛屼絾鍦╓IN32涓嬪氨鏃犳硶瀹炵幇綾諱技fork鐨勫姛鑳戒簡(jiǎn)銆傛墍浠ョ幇鍦╓IN32涓嬬殑C璇█緙栬瘧鍣ㄦ墍鎻愪緵鐨勫簱鍑芥暟铏界劧宸茬粡鑳藉吋瀹瑰ぇ澶氭暟
Linux/UNIX鐨勫簱鍑芥暟錛屼絾鍗翠粛鏃犳硶瀹炵幇fork銆?
瀵逛簬澶氫換鍔$郴緇燂紝鍏變韓鏁版嵁鍖烘槸蹇呰鐨勶紝浣嗕篃鏄竴涓鏄撳紩璧鋒販涔辯殑闂錛屽湪WIN32涓嬶紝涓涓▼搴忓憳寰堝鏄撳繕璁扮嚎紼嬩箣闂寸殑鏁版嵁鏄叡浜殑榪欎竴鎯呭喌錛屼竴涓嚎紼嬩慨
鏀硅繃涓涓彉閲忓悗錛屽彟涓涓嚎紼嬪嵈鍙堜慨鏀逛簡(jiǎn)瀹冿紝緇撴灉寮曡搗紼嬪簭鍑洪棶棰樸備絾鍦↙inux涓嬶紝鐢變簬鍙橀噺鏈潵騫朵笉鍏變韓錛岃岀敱紼嬪簭鍛樻潵鏄懼紡鍦版寚瀹氳鍏變韓鐨勬暟鎹紝浣跨▼搴忓彉
寰楁洿娓呮櫚涓庡畨鍏ㄣ? 鑷充簬WIN32鐨?榪涚▼"姒傚康錛屽叾鍚箟鍒欐槸"搴旂敤紼嬪簭"錛屼篃灝辨槸鐩稿綋浜嶶NIX涓嬬殑exec浜?jiǎn)銆?br> ]]> unix澶氳繘紼? http://www.shnenglu.com/yehongly/archive/2007/12/18/38904.html鑼?/dc:creator>鑼?/author>Tue, 18 Dec 2007 07:41:00 GMT http://www.shnenglu.com/yehongly/archive/2007/12/18/38904.html http://www.shnenglu.com/yehongly/comments/38904.html http://www.shnenglu.com/yehongly/archive/2007/12/18/38904.html#Feedback 0 http://www.shnenglu.com/yehongly/comments/commentRss/38904.html http://www.shnenglu.com/yehongly/services/trackbacks/38904.html linux涓嬬殑澶氳繘紼嬬紪紼?/strong>(2007-5-21,11:17:55) 浠涔堟槸涓涓繘紼嬶紵榪涚▼榪欎釜姒傚康鏄拡瀵圭郴緇熻屼笉鏄拡瀵圭敤鎴風(fēng)殑錛屽鐢ㄦ埛鏉ヨ錛屼粬闈㈠鐨勬蹇墊槸紼嬪簭銆傚綋鐢ㄦ埛鏁插叆鍛戒護(hù)鎵ц涓涓▼搴忕殑鏃跺欙紝瀵圭郴緇熻岃█錛屽畠?yōu)畣鍚姩涓涓繘紼嬨備絾鍜岀▼搴忎笉鍚岀殑鏄紝鍦ㄨ繖涓繘紼嬩腑錛岀郴緇熷彲鑳介渶瑕佸啀鍚姩涓涓垨澶氫釜榪涚▼鏉ュ畬鎴愮嫭绔嬬殑澶氫釜浠誨姟銆傚榪涚▼緙栫▼鐨勪富瑕佸唴瀹瑰寘鎷繘紼嬫帶鍒跺拰榪涚▼闂撮氫俊錛屽湪浜?jiǎn)瑙q欎簺涔嬪墠錛屾垜浠厛瑕佺畝鍗曠煡閬撹繘紼嬬殑緇撴瀯銆?br>2.1 Linux涓嬭繘紼嬬殑緇撴瀯 Linux涓嬩竴涓繘紼嬪湪鍐呭瓨閲屾湁涓夐儴鍒嗙殑鏁版嵁錛屽氨鏄?浠g爜孌?銆?鍫嗘爤孌?鍜?鏁版嵁孌?.鍏跺疄瀛﹁繃姹囩紪璇█鐨勪漢涓瀹氱煡閬擄紝涓鑸殑CPU閮芥湁涓婅堪涓夌孌靛瘎瀛樺櫒錛屼互鏂逛究鎿嶄綔緋葷粺鐨勮繍琛屻傝繖涓変釜閮ㄥ垎涔熸槸鏋勬垚涓涓畬鏁寸殑鎵ц搴忓垪鐨勫繀瑕佺殑閮ㄥ垎銆?br>"浠g爜孌?錛岄【鍚嶆濅箟錛屽氨鏄瓨鏀句簡(jiǎn)紼嬪簭浠g爜鐨勬暟鎹紝鍋囧鏈哄櫒涓湁鏁頒釜榪涚▼榪愯鐩稿悓鐨勪竴涓▼搴?a >nokia s40 涓婚涓嬭澆 錛岄偅涔堝畠浠氨鍙互浣跨敤鐩稿悓鐨勪唬鐮佹銆?鍫嗘爤孌?瀛樻斁鐨勫氨鏄瓙紼嬪簭鐨勮繑鍥炲湴鍧銆佸瓙紼嬪簭鐨勫弬鏁頒互鍙?qiáng)绋嬪簭鐨勫眬閮ㄥ彉閲忋傝屾暟鎹鍒欏瓨鏀劇▼搴忕殑鍏ㄥ眬鍙橀噺錛屽父鏁頒互鍙?qiáng)鍔ㄦ佹暟鎹垎閰嶇殑鏁版嵁絀洪棿錛堟瘮濡傜敤malloc涔嬬被鐨勫嚱鏁板彇寰楃殑絀洪棿錛夈傝繖鍏朵腑鏈夎澶氱粏鑺傞棶棰橈紝榪欓噷闄愪簬綃囧箙灝變笉澶氫粙緇嶄簡(jiǎn)銆傜郴緇熷鏋滃悓鏃惰繍琛屾暟涓浉鍚岀殑紼嬪簭錛屽畠浠箣闂村氨涓嶈兘浣跨敤鍚屼竴涓爢鏍堟鍜屾暟鎹銆?br>2.2 Linux涓嬬殑榪涚▼鎺у埗 鍦ㄤ紶緇熺殑Unix鐜涓嬶紝鏈変袱涓熀鏈殑鎿嶄綔鐢ㄤ簬鍒涘緩鍜屼慨鏀硅繘紼嬶細(xì)鍑芥暟fork錛?錛夌敤鏉ュ垱寤轟竴涓柊鐨勮繘紼嬶紝璇ヨ繘紼嬪嚑涔庢槸褰撳墠榪涚▼鐨勪竴涓畬鍏ㄦ嫹璐濓紱鍑芥暟鏃廵xec錛?錛夌敤鏉ュ惎鍔ㄥ彟澶栫殑榪涚▼浠ュ彇浠e綋鍓嶈繍琛岀殑榪涚▼銆侺inux鐨勮繘紼嬫帶鍒跺拰浼犵粺鐨刄nix榪涚▼鎺у埗鍩烘湰涓鑷達(dá)紝鍙湪涓浜涚粏鑺傜殑鍦版柟鏈変簺鍖哄埆鎵嬫満鍜岀粴閾冨0 錛屼緥濡傚湪Linux緋葷粺涓皟鐢╲fork鍜宖ork瀹屽叏鐩稿悓錛岃屽湪鏈変簺鐗堟湰鐨刄nix緋葷粺涓紝vfork璋冪敤鏈変笉鍚岀殑鍔熻兘銆傜敱浜庤繖浜涘樊鍒嚑涔庝笉褰卞搷鎴戜滑澶у鏁扮殑緙栫▼錛屽湪榪欓噷鎴戜滑涓嶄簣鑰冭檻銆?br>2.2.1 fork錛?錛?br>fork鍦ㄨ嫳鏂囦腑鏄?鍒嗗弶"鐨勬剰鎬濄備負(fù)浠涔堝彇榪欎釜鍚嶅瓧鍛紵鍥犱負(fù)涓涓繘紼嬪湪榪愯涓紝濡傛灉浣跨敤浜?jiǎn)fork錛屽氨浜х敓浜?jiǎn)鍙︿竴涓繘紼嬶紝浜庢槸榪涚▼灝?鍒嗗弶"浜?jiǎn)锛屾墍浠ヨ繖涓悕瀛楀彇寰楀緢褰㈣薄銆備笅闈㈠氨鐪嬬湅濡備綍鍏蜂綋浣跨敤fork錛岃繖孌電▼搴忔紨紺轟簡(jiǎn)浣跨敤fork鐨勫熀鏈鏋訛細(xì) void main(){ int i; if ( fork() == 0 ) { /* 瀛愯繘紼嬬▼搴?*/ for ( i = 1; i <1000; i ++ ) printf("This is child process "); } else { /* 鐖惰繘紼嬬▼搴?/ for ( i = 1; i <1000; i ++ ) printf("This is process process "); } } 紼嬪簭榪愯鍚庯紝浣犲氨鑳界湅鍒板睆騫曚笂浜ゆ浛鍑虹幇瀛愯繘紼嬩笌鐖惰繘紼嬪悇鎵撳嵃鍑虹殑涓鍗冩潯淇℃伅浜?jiǎn)銆傚鏋滅▼搴忚繕鍦ㄨ繍琛屼腑錛屼綘鐢╬s鍛戒護(hù)灝辮兘鐪嬪埌緋葷粺涓湁涓や釜瀹冨湪榪愯浜?jiǎn)銆?閭d箞璋冪敤榪欎釜fork鍑芥暟鏃跺彂鐢熶簡(jiǎn)浠涔堝憿錛焒ork鍑芥暟鍚姩涓涓柊鐨勮繘紼嬶紝鍓嶉潰鎴戜滑璇磋繃錛岃繖涓繘紼嬪嚑涔庢槸褰撳墠榪涚▼鐨勪竴涓嫹璐濓細(xì)瀛愯繘紼嬪拰鐖惰繘紼嬩嬌鐢ㄧ浉鍚岀殑浠g爜孌碉紱瀛愯繘紼嬪鍒剁埗榪涚▼鐨勫爢鏍堟鍜屾暟鎹銆傝繖鏍鳳紝鐖惰繘紼嬬殑鎵鏈夋暟鎹兘鍙互鐣欑粰瀛愯繘紼嬶紝浣嗘槸錛屽瓙榪涚▼涓鏃﹀紑濮嬭繍琛岋紝铏界劧瀹冪戶鎵夸簡(jiǎn)鐖惰繘紼嬬殑涓鍒囨暟鎹紝浣嗗疄闄呬笂鏁版嵁鍗村凡緇忓垎寮錛岀浉浜掍箣闂翠笉鍐嶆湁褰卞搷浜?jiǎn)锛屼篃灏辨槸璇村Q屽畠浠箣闂翠笉鍐嶅叡浜換浣曟暟鎹簡(jiǎn)銆傚畠浠啀瑕佷氦浜掍俊鎭椂錛屽彧鏈夐氳繃榪涚▼闂撮氫俊鏉ュ疄鐜幫紝榪欏皢鏄垜浠笅闈㈢殑鍐呭銆傛棦鐒跺畠浠姝ょ浉璞★紝緋葷粺濡備綍鏉ュ尯鍒嗗畠浠憿錛熻繖鏄敱鍑芥暟鐨勮繑鍥炲兼潵鍐沖畾鐨勩傚浜庣埗榪涚▼錛宖ork鍑芥暟榪斿洖浜?jiǎn)瀛惤E嬪簭鐨勮繘紼嬪彿錛岃屽浜庡瓙紼嬪簭涓叴灝忕伒閫氭潵鐢?shù)褰╅?/font> 錛宖ork鍑芥暟鍒欒繑鍥為浂銆傚湪鎿嶄綔緋葷粺涓紝鎴戜滑鐢╬s鍑芥暟灝卞彲浠ョ湅鍒頒笉鍚岀殑榪涚▼鍙鳳紝瀵圭埗榪涚▼鑰岃█錛屽畠鐨勮繘紼嬪彿鏄敱姣斿畠鏇翠綆灞傜殑緋葷粺璋冪敤璧嬩簣鐨勶紝鑰屽浜庡瓙榪涚▼鑰岃█錛屽畠鐨勮繘紼嬪彿鍗蟲槸fork鍑芥暟瀵圭埗榪涚▼鐨勮繑鍥炲箋傚湪紼嬪簭璁捐涓紝鐖惰繘紼嬪拰瀛愯繘紼嬮兘瑕佽皟鐢ㄥ嚱鏁癴ork錛堬級(jí)涓嬮潰鐨勪唬鐮?a >nokia 7650 閾冨0 錛岃屾垜浠氨鏄埄鐢╢ork錛堬級(jí)鍑芥暟瀵圭埗瀛愯繘紼嬬殑涓嶅悓榪斿洖鍊肩敤if……else……璇彞鏉ュ疄鐜拌鐖跺瓙榪涚▼瀹屾垚涓嶅悓鐨勫姛鑳斤紝姝e鎴戜滑涓婇潰涓劇殑渚嬪瓙涓鏍楓傛垜浠湅鍒幫紝涓婇潰渚嬪瓙鎵ц鏃朵袱鏉′俊鎭槸浜や簰鏃犺鍒欑殑鎵撳嵃鍑烘潵鐨?a >cect閾冨0涓嬭澆 錛岃繖鏄埗瀛愯繘紼嬬嫭绔嬫墽琛岀殑緇撴灉錛岃櫧鐒舵垜浠殑浠g爜浼間箮鍜屼覆琛岀殑浠g爜娌℃湁浠涔堝尯鍒?璇昏呬篃璁鎬細(xì)闂紝濡傛灉涓涓ぇ紼嬪簭鍦ㄨ繍琛屼腑錛屽畠鐨勬暟鎹鍜屽爢鏍堥兘寰堝ぇ錛屼竴嬈ork灝辮澶嶅埗涓嬈★紝閭d箞fork鐨勭郴緇熷紑閿涓嶆槸寰堝ぇ鍚楋紵鍏跺疄UNIX鑷湁鍏惰В鍐崇殑鍔炴硶錛屽ぇ瀹剁煡閬擄紝涓鑸珻PU閮芥槸浠?欏?涓哄崟浣嶆潵鍒嗛厤鍐呭瓨絀洪棿鐨勶紝姣忎竴涓〉閮芥槸瀹為檯鐗╃悊鍐呭瓨鐨勪竴涓槧鍍忥紝璞NTEL鐨凜PU錛屽叾涓欏靛湪閫氬父鎯呭喌涓嬫槸4086瀛楄妭澶у皬錛岃屾棤璁烘槸鏁版嵁孌佃繕鏄爢鏍堟閮芥槸鐢辮澶?欏?鏋勬垚鐨勶紝fork鍑芥暟澶嶅埗榪欎袱涓錛屽彧鏄?閫昏緫"涓婄殑錛屽茍闈?鐗╃悊"涓婄殑錛屼篃灝辨槸璇達(dá)紝瀹為檯鎵цfork鏃訛紝鐗╃悊絀洪棿涓婁袱涓繘紼嬬殑鏁版嵁孌靛拰鍫嗘爤孌甸兘榪樻槸鍏變韓鐫鐨勶紝褰撴湁涓涓繘紼嬪啓浜?jiǎn)鏌愪釜鏁版嵁鏃跺Q岃繖鏃朵袱涓繘紼嬩箣闂寸殑鏁版嵁鎵嶆湁浜?jiǎn)鍖哄埆锛尵p葷粺灝卞皢鏈夊尯鍒殑"欏?浠庣墿鐞嗕笂涔熷垎寮銆傜郴緇熷湪絀洪棿涓婄殑寮閿灝卞彲浠ヨ揪鍒版渶灝忋?br>銆銆 涓嬮潰婕旂ず涓涓凍浠?鎼炴"Linux鐨勫皬紼嬪簭錛屽叾婧愪唬鐮侀潪甯哥畝鍗曪細(xì) 銆銆void main() 銆銆 { 銆銆銆銆 for( ; ; ) fork(); 銆銆 } 銆銆榪欎釜紼嬪簭浠涔堜篃涓嶅仛錛屽氨鏄寰幆鍦癴ork錛屽叾緇撴灉鏄▼搴忎笉鏂駭鐢熻繘紼嬶紝鑰岃繖浜涜繘紼嬪張涓嶆柇浜х敓鏂扮殑榪涚▼錛屽緢蹇紝緋葷粺鐨勮繘紼嬪氨婊′簡(jiǎn)錛岀郴緇熷氨琚繖涔堝涓嶆柇浜х敓鐨勮繘紼?鎾戞浜?銆傚綋鐒跺彧瑕佺郴緇熺鐞嗗憳棰勫厛緇欐瘡涓敤鎴瘋緗彲榪愯鐨勬渶澶ц繘紼嬫暟錛岃繖涓伓鎰忕殑紼嬪簭灝卞畬鎴愪笉浜?jiǎn)浼佸浘浜?jiǎn)銆?br>銆銆 2.2.2 exec( )鍑芥暟鏃?br>銆銆涓嬮潰鎴戜滑鏉ョ湅鐪嬩竴涓繘紼嬪浣曟潵鍚姩鍙︿竴涓▼搴忕殑鎵ц銆傚湪Linux涓浣跨敤exec鍑芥暟鏃忋傜郴緇熻皟鐢╡xecve錛堬級(jí)瀵瑰綋鍓嶈繘紼嬭繘琛屾浛鎹紝鏇挎崲鑰呬負(fù)涓涓寚瀹氱殑紼嬪簭錛屽叾鍙傛暟鍖呮嫭鏂囦歡鍚嶏紙filename錛夈佸弬鏁板垪琛紙argv錛変互鍙?qiáng)鐜鍙橀噺锛坋nvp錛夈俥xec鍑芥暟鏃忓綋鐒朵笉姝竴涓紝浣嗗畠浠ぇ鑷寸浉鍚岋紝鍦↙inux涓紝瀹冧滑鍒嗗埆鏄細(xì)execl錛宔xeclp鎼炵瑧瀹濆疂褰╅搩 錛宔xecle錛宔xecv錛宔xecve鍜宔xecvp錛屼笅闈㈡垜鍙互execlp涓轟緥錛屽叾瀹冨嚱鏁扮┒绔熶笌execlp鏈変綍鍖哄埆錛岃閫氳繃manexec鍛戒護(hù)鏉ヤ簡(jiǎn)瑙e畠浠殑鍏蜂綋鎯呭喌銆?br>銆銆涓涓繘紼嬩竴鏃﹁皟鐢╡xec綾誨嚱鏁幫紝瀹冩湰韜氨"姝諱骸"浜?jiǎn)锛尵p葷粺鎶婁唬鐮佹鏇挎崲鎴愭柊鐨勭▼搴忕殑浠g爜錛屽簾寮冨師鏈夌殑鏁版嵁孌靛拰鍫嗘爤孌碉紝騫朵負(fù)鏂扮▼搴忓垎閰嶆柊鐨勬暟鎹涓庡爢鏍堟錛屽敮涓鐣欎笅鐨勶紝灝辨槸榪涚▼鍙鳳紝涔熷氨鏄錛屽緋葷粺鑰岃█錛岃繕鏄悓涓涓繘紼嬶紝涓嶈繃宸茬粡鏄彟涓涓▼搴忎簡(jiǎn)銆傦紙涓嶈繃exec綾誨嚱鏁頒腑鏈夌殑榪樺厑璁哥戶鎵跨幆澧冨彉閲忎箣綾葷殑淇℃伅銆傦級(jí) 銆銆閭d箞濡傛灉鎴戠殑紼嬪簭鎯沖惎鍔ㄥ彟涓紼嬪簭鐨勬墽琛屼絾鑷繁浠嶆兂緇х畫榪愯鐨勮瘽錛屾庝箞鍔炲憿錛熼偅灝辨槸緇撳悎fork涓巈xec鐨勪嬌鐢ㄣ備笅闈竴孌典唬鐮佹樉紺哄浣曞惎鍔ㄨ繍琛屽叾瀹冪▼搴忥細(xì)char command[256]; void main() { int rtn; /*瀛愯繘紼嬬殑榪斿洖鏁板?/ while(1) { /* 浠庣粓绔鍙栬鎵ц鐨勫懡浠?*/ printf( ">" ); fgets( command, 256, stdin ); command[strlen(command)-1] = 0; if ( fork() == 0 ) { /* 瀛愯繘紼嬫墽琛屾鍛戒護(hù) */ execlp( command, command ); /* 濡傛灉exec鍑芥暟榪斿洖錛岃〃鏄庢病鏈夋甯告墽琛屽懡浠わ紝鎵撳嵃閿欒淇℃伅*/ perror( command ); exit( errorno ); } else { /* 鐖惰繘紼嬶紝 絳夊緟瀛愯繘紼嬬粨鏉燂紝騫舵墦鍗板瓙榪涚▼鐨勮繑鍥炲?*/ wait ( &rtn ); printf( " child process return %d ",. rtn ); } } } 銆銆姝ょ▼搴忎粠緇堢璇誨叆鍛戒護(hù)騫舵墽琛屼箣錛屾墽琛屽畬鎴愬悗錛岀埗榪涚▼緇х畫絳夊緟浠庣粓绔鍏ュ懡浠ゃ傜啛鎮(zhèn)塂OS鍜學(xué)INDOWS緋葷粺璋冪敤鐨勬湅鍙嬩竴瀹氱煡閬揇OS/WINDOWS涔熸湁exec綾誨嚱鏁幫紝鍏朵嬌鐢ㄦ柟娉曟槸綾諱技鐨?a >澶╂觸鑱旈氶搩闊充笅杞?/font>錛屼絾DOS/WINDOWS榪樻湁spawn綾誨嚱鏁幫紝鍥犱負(fù)DOS鏄崟浠誨姟鐨勭郴緇燂紝瀹冨彧鑳藉皢"鐖惰繘紼?椹葷暀鍦ㄦ満鍣ㄥ唴鍐嶆墽琛?瀛愯繘紼?錛岃繖灝辨槸spawn綾葷殑鍑芥暟銆俉IN32宸茬粡鏄浠誨姟鐨勭郴緇熶簡(jiǎn)錛屼絾榪樹繚鐣欎簡(jiǎn)spawn綾誨嚱鏁幫紝W(xué)IN32涓疄鐜皊pawn鍑芥暟鐨勬柟娉曞悓鍓嶈堪UNIX涓殑鏂規(guī)硶宸笉澶氾紝寮璁懼瓙榪涚▼鍚庣埗榪涚▼絳夊緟瀛愯繘紼嬬粨鏉熷悗鎵嶇戶緇繍琛屻俇NIX鍦ㄥ叾涓寮濮嬪氨鏄浠誨姟鐨勭郴緇燂紝鎵浠ヤ粠鏍稿績(jī)瑙掑害涓婅涓嶉渶瑕乻pawn綾誨嚱鏁般?br>銆銆鍦ㄨ繖涓鑺傞噷錛屾垜浠繕瑕佽璁瞫ystem錛堬級(jí)鍜宲open錛堬級(jí)鍑芥暟銆俿ystem錛堬級(jí)鍑芥暟鍏堣皟鐢╢ork錛堬級(jí)錛岀劧鍚庡啀璋冪敤exec錛堬級(jí)鏉ユ墽琛岀敤鎴風(fēng)殑鐧誨綍shell錛岄氳繃瀹冩潵鏌ユ壘鍙墽琛屾枃浠剁殑鍛戒護(hù)騫跺垎鏋愬弬鏁幫紝鏈鍚庡畠涔堜嬌鐢╳ait錛堬級(jí)鍑芥暟鏃忎箣涓鏉ョ瓑寰呭瓙榪涚▼鐨勭粨鏉熴傚嚱鏁皃open錛堬級(jí)鍜屽嚱鏁皊ystem錛堬級(jí)鐩鎬技錛屼笉鍚岀殑鏄畠璋冪敤pipe錛堬級(jí)鍑芥暟鍒涘緩涓涓閬擄紝閫氳繃瀹冩潵瀹屾垚紼嬪簭鐨勬爣鍑嗚緭鍏ュ拰鏍囧噯杈撳嚭銆傝繖涓や釜鍑芥暟鏄負(fù)閭d簺涓嶅お鍕ゅ揩鐨勭▼搴忓憳璁捐鐨勶紝鍦ㄦ晥鐜囧拰瀹夊叏鏂歸潰閮芥湁鐩稿綋鐨勭己闄鳳紝鍦ㄥ彲鑳界殑鎯呭喌涓嬶紝搴旇灝介噺閬垮厤銆?br>Linux鑱旂洘鏀墮泦鏁寸悊http://www.allegations.com.cn/baidu/8003/982.htm ]]> unix澶氳繘紼?/title> http://www.shnenglu.com/yehongly/archive/2007/12/18/38872.html鑼?/dc:creator>鑼?/author>Tue, 18 Dec 2007 05:35:00 GMT http://www.shnenglu.com/yehongly/archive/2007/12/18/38872.html http://www.shnenglu.com/yehongly/comments/38872.html http://www.shnenglu.com/yehongly/archive/2007/12/18/38872.html#Feedback 0 http://www.shnenglu.com/yehongly/comments/commentRss/38872.html http://www.shnenglu.com/yehongly/services/trackbacks/38872.html 闃呰鍏ㄦ枃 ]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
欧美天天在线 |
99re6热在线精品视频播放速度 |
亚洲影视中文字幕 |
狠狠色综合日日 |
在线播放视频一区 |
另类图片国产 |
欧美国产精品v |
亚洲一区在线播放 |
亚洲欧美一区二区精品久久久 |
国产欧美精品一区二区三区介绍
|
狼人天天伊人久久 |
日韩视频免费 |
亚洲午夜在线 |
伊人成人在线视频 |
亚洲精品国产精品国产自 |
欧美精品久久99 |
午夜久久影院 |
欧美xart系列高清 |
欧美一级艳片视频免费观看 |
久久亚洲综合色 |
亚洲一区久久久 |
久久婷婷国产综合尤物精品 |
夜夜嗨av一区二区三区 |
小嫩嫩精品导航 |
亚洲毛片在线观看. |
午夜欧美理论片 |
99精品久久久 |
久久国产66 |
亚洲亚洲精品三区日韩精品在线视频 |
亚洲欧美日韩精品 |
日韩一区二区电影网 |
欧美在线不卡 |
亚洲欧美一区二区三区久久 |
久久久一二三 |
香蕉av福利精品导航 |
欧美高清日韩 |
久久影音先锋 |
国产精品久在线观看 |
亚洲国产精品美女 |
一区二区亚洲精品国产 |
亚洲在线1234 |
亚洲一区二区三区在线观看视频 |
久久久久久亚洲综合影院红桃 |
亚洲一区二区三区精品在线 |
可以免费看不卡的av网站 |
午夜日韩av |
国产精品第十页 |
亚洲国产一区二区在线 |
黄色成人在线 |
午夜视频在线观看一区二区 |
亚洲一级二级 |
欧美日韩国产不卡 |
亚洲黄色在线 |
亚洲欧洲精品一区二区三区不卡
|
久久爱另类一区二区小说 |
亚洲一区二区精品 |
欧美视频在线免费 |
99视频在线观看一区三区 |
亚洲精品黄网在线观看 |
你懂的一区二区 |
亚洲第一黄色网 |
亚洲欧美美女 |
免费欧美高清视频 |
国产精品欧美久久 |
亚洲一级网站 |
久久久www |
国产喷白浆一区二区三区 |
亚洲一区二区3 |
欧美一区二区高清 |
国内精品久久久久影院优 |
欧美一区二区三区在线看
|
亚洲免费高清 |
欧美激情性爽国产精品17p |
亚洲欧洲精品天堂一级 |
99在线热播精品免费99热 |
欧美日韩亚洲一区三区 |
一本在线高清不卡dvd |
亚洲综合色噜噜狠狠 |
国产精品午夜电影 |
久久国产一区 |
亚洲高清视频在线观看 |
一区二区三区视频在线观看 |
欧美日韩综合网 |
性欧美18~19sex高清播放 |
久久久综合网站 |
亚洲精品乱码久久久久久 |
欧美日韩免费看 |
性欧美精品高清 |
亚洲电影免费 |
亚洲在线1234 |
国内精品久久久久久久97牛牛 |
久热国产精品视频 |
av成人免费 |
老色鬼精品视频在线观看播放 |
亚洲国产日韩欧美在线动漫 |
欧美二区不卡 |
午夜精品一区二区三区四区
|
欧美激情在线 |
亚洲欧美文学 |
亚洲人成免费 |
国产精品自拍在线 |
久热精品在线 |
亚洲影院色在线观看免费 |
久久中文久久字幕 |
一区二区三区黄色 |
在线观看视频亚洲 |
国产精品一二 |
欧美精品国产精品日韩精品 |
欧美一区二区在线免费观看 |
91久久国产综合久久 |
久久精品国产一区二区电影 |
日韩视频亚洲视频 |
国语自产精品视频在线看 |
欧美日韩精品一区二区 |
久久久午夜电影 |
亚洲一区二区三区777 |
欧美黄色日本 |
久久嫩草精品久久久精品一
|
国产一区二区在线观看免费播放 |
欧美黑人在线观看 |
狂野欧美激情性xxxx |
亚洲男人的天堂在线观看 |
亚洲精品欧美日韩专区 |
麻豆精品在线观看 |
久久久久久欧美 |
亚洲欧美一级二级三级 |
亚洲视频在线一区 |
亚洲欧洲精品成人久久奇米网 |
国产亚洲一区二区三区 |
国产精品v日韩精品 |
亚洲免费黄色 |
久久久久.com |
亚洲精品乱码久久久久 |
国产欧美日韩三级 |
欧美三级特黄 |
欧美电影免费观看高清 |
久久久久欧美精品 |
午夜视频在线观看一区二区 |
一本大道久久精品懂色aⅴ |
欧美成人免费观看 |
麻豆成人小视频 |
久久精品国产清高在天天线 |
午夜精品国产更新 |
亚洲午夜女主播在线直播 |
av成人动漫 |
99国产精品国产精品久久
|
国产一区二区丝袜高跟鞋图片 |
欧美午夜精品一区二区三区 |
欧美日韩一区二区在线观看视频
|
亚洲免费精品 |
亚洲国产91精品在线观看 |
欧美77777 |
欧美激情中文不卡 |
亚洲国产福利在线 |
亚洲精品影院在线观看 |
亚洲免费成人av |
一区二区三区四区在线 |
亚洲校园激情 |
欧美夜福利tv在线 |
久久婷婷国产综合尤物精品
|
香蕉久久精品日日躁夜夜躁 |
午夜精品久久久久久久男人的天堂 |
亚洲欧美日韩视频一区 |
欧美在线影院 |
欧美激情在线 |
国产精品羞羞答答 |
揄拍成人国产精品视频 |
亚洲欧洲日本国产 |
午夜精品视频一区 |
美女脱光内衣内裤视频久久网站 |
亚洲福利视频网 |
亚洲老司机av |
欧美在线观看视频在线 |
欧美成人午夜激情视频 |
欧美午夜不卡在线观看免费
|
欧美日韩在线亚洲一区蜜芽 |
国产精品资源 |
9国产精品视频 |
欧美在线观看一区二区三区 |
久久夜色精品国产欧美乱极品 |
亚洲第一精品夜夜躁人人爽 |
99视频精品全部免费在线 |
欧美与黑人午夜性猛交久久久 |
欧美激情欧美激情在线五月 |
国产精品拍天天在线 |
亚洲国产免费看 |
欧美一区二区黄色 |
亚洲精品一区二区三区樱花 |
久久国产欧美精品 |
欧美午夜精品久久久久久孕妇 |
又紧又大又爽精品一区二区 |
午夜精品视频一区 |
亚洲精品在线一区二区 |
久久久久国色av免费观看性色 |
国产精品sss |
亚洲精品乱码久久久久久日本蜜臀
|
午夜欧美大片免费观看 |
性欧美大战久久久久久久久 |
欧美a一区二区 |
国产一区二区三区奇米久涩 |