锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 銆銆1銆佹煡璇㈢郴緇熶腑瀹夎鐨勬墍鏈塕PM鍖?/p>
銆銆$ rpm -qa 銆銆鏌ヨ褰撳墠linux緋葷粺涓凡緇忓畨瑁呯殑杞歡鍖呫?/p>
銆銆渚嬶細$ rpm -qa | grep -i x11 | head -3 瀵熺湅緋葷粺涓寘鍚玿11瀛楃涓茬殑鍓?琛岃蔣浠跺寘銆?/p>
銆銆2銆佹煡璇㈣蔣浠跺寘鏄惁瀹夎 銆銆$ rpm –q rpm鍖呭悕縐?瀵熺湅緋葷粺涓寚瀹氳蔣浠跺寘鏄惁瀹夈?/p>
銆銆渚? $ rpm -q bash 瀵熺湅緋葷粺涓璪ash杞歡鍖呮槸鍚﹀畨瑁呫?/p>
銆銆"rpm -q"鍛戒護涓寚瀹氱殑杞歡鍖呭悕縐伴渶瑕佸噯紜殑鎷煎啓錛岃鍛戒護涓嶄細鍦ㄨ蔣浠跺寘鐨勫悕縐頒腑榪涜灞閮ㄥ尮閰嶇殑鏌ヨ銆?/p>
銆銆3銆佹煡璇㈠凡瀹夎杞歡鍖呰緇嗕俊鎭?/p>
銆銆$ rpm –qi RPM鍖呭悕縐?鏌ヨlinux緋葷粺涓寚瀹氬悕縐拌蔣浠跺寘鐨勮緇嗕俊鎭?/p>
銆銆渚嬶細$ rpm -qi bash 瀵熺湅bash杞歡鍖呯殑璇︾粏淇℃伅銆?/p>
銆銆"rpm -qi"鍛戒護鐨勬墽琛岀粨鏋滀腑鍖呭惈杈冭緇嗙殑淇℃伅錛屽寘鎷細杞歡鍚嶇О錛岀増鏈俊鎭紝鍖呭ぇ灝忥紝鎻忚堪錛岀瓑銆?/p>
銆銆4銆佹煡璇㈠凡瀹夎杞歡鍖呬腑鐨勬枃浠跺垪琛?/p>
銆銆$ rpm –ql RPM鍖呭悕縐?鏌ヨ宸插畨瑁呰蔣浠跺寘鍦ㄥ綋鍓嶇郴緇熶腑瀹夎浜嗗摢浜涙枃浠躲?/p>
銆銆渚嬶細$ rpm -ql bash | head -3 鏌ョ湅bash杞歡鍦ㄧ郴緇熶腑宸插畨瑁呮枃浠剁殑鍓?琛屾枃浠跺垪琛ㄣ?/p>
銆銆$ rpm -ql bash | grep bin 鐢ㄨ繃婊ゆ柟寮忓療鐪媌ash涓寘鍚玝in瀛楃涓茬殑鏂囦歡鍒楄〃銆?/p>
銆銆5銆佹煡璇㈢郴緇熶腑鏂囦歡鎵灞炵殑杞歡鍖?/p>
銆銆$ rpm –qf 鏂囦歡鍚嶇О 鏌ヨlinux緋葷粺涓寚瀹氭枃浠舵墍灞炵殑杞歡鍖呫?/p>
銆銆渚嬶細$ rpm -qf /bin/bash 瀵熺湅bash鏂囦歡鎵灞炵殑杞歡鍖呫?/p>
銆銆bash-3.0-19.2 鏄劇ず緇撴灉銆?/p>
銆銆6銆佹煡璇PM瀹夎鍖呮枃浠朵腑鐨勪俊鎭? 銆銆$ rpm –qpi RPM鍖呮枃浠跺悕 瀵熺湅RPM鍖呮湭瀹夎鍓嶇殑璇︾粏淇℃伅銆?/p>
銆銆$ rpm –qpl RPM鍖呮枃浠跺悕 瀵熺湅RPM鍖呮湭瀹夎鍓嶇殑鏂囦歡鍒楄〃銆?/p>
銆銆"rpm -qpi鍜宺pm -qpl 榪欎袱鏉″懡浠ゅ彲浣滀負鍦ㄥ畨瑁呰蔣浠跺寘涔嬪墠瀵瑰叾鐨勪簡瑙c?/p>
銆銆7銆乺pm鍛戒護鏌ヨ瀹炰緥 銆銆$ which mount 鑾峰緱mount鍛戒護鐨勫彲鎵ц鏂囦歡璺緞銆?/p>
銆銆$ rpm –qf /bin/mount 鏌ヨ/bin/mount鎵灞炵殑杞歡鍖呫?/p>
銆銆$ rpm –qi util-linux 鏌ヨ/bin/mount鎵灞炶蔣浠跺寘鐨勮緇嗕俊鎭?/p>
銆銆$ rpm –qf util-linux | grep mount 鏌ヨ/bin/mount鎵灞炶蔣浠跺寘涓寘鎷琺ount鐩稿叧鎵鏈夋枃浠躲?/p>
銆銆浣跨敤rpm鍛戒護瀹夎杞歡鍖咃細 銆銆1銆乺pm杞歡鍖呭湴鍩烘湰瀹夎 銆銆$ rpm –i rpm瀹夎鍖呮枃浠跺悕 瀹夎璇ヨ蔣浠跺寘涓殑鏂囦歡鍒板綋鍓嶇郴緇燂紝瀹夎榪囩▼涓嶆彁紺轟換浣曚俊鎭?/p>
銆銆2銆佸湪瀹夎杞歡鍖呯殑鍚屾椂鏄劇ず璇︾粏淇℃伅 銆銆$ rpm –ivh rpm瀹夎鍖呮枃浠?瀹夎璇ヨ蔣浠跺寘涓殑鏂囦歡鍒板綋鍓嶇郴緇燂紝瀹夎榪囩▼浼氫互鐧懼垎姣旂殑褰㈠紡鏄劇ず瀹夎鐨勮繘搴﹀拰涓浜涘叾浠栦俊鎭?/p>
銆銆3銆丷PM杞歡鍖呭畨瑁呯殑渚濊禆鍏崇郴 銆銆寮哄埗瀹夎錛? rpm --force –i rpm鍖呮枃浠跺悕 銆銆娉細瑕佸厛婊¤凍杞歡鍖呯殑渚濊禆鍏崇郴鍚庡啀榪涜杞歡鍖呯殑瀹夎錛屼嬌鐢ㄥ己鍒跺畨瑁呭懡浠ゅ畨瑁呬笉鑳戒繚璇佽蔣浠跺畨瑁呭埌緋葷粺鍚庝竴瀹氳兘 銆銆姝e父榪愯錛屽洜姝ゅ緩璁厧閲嶄嬌鐢ㄣ?/p>
銆銆浣跨敤rpm鍛戒護鍗歌澆杞歡鍖咃細 銆銆1銆丷PM杞歡鍖呯殑鍗歌澆 銆銆$ rpm -e 杞歡鍖呭悕縐?/p>
銆銆杞歡鍖呯殑鍗歌澆錛屽湪鍗歌澆鏃朵笉鏄劇ず浠諱綍淇℃伅銆?/p>
銆銆娉細RPM杞歡鍖呯殑鍗歌澆鍚屾牱瀛樺湪渚濊禆鍏崇郴錛屽彧鏈夊湪娌℃湁渚濊禆鍏崇郴瀛樺湪鏃舵墠鑳藉鍏惰繘琛屽嵏杞姐?/p>
銆銆2銆乺pm杞歡鍖呭嵏杞界殑渚濊禆鍏崇郴 銆銆鍦ㄤ嬌鐢≧PM鍛戒護榪涜鍗歌澆鏃訛紝RPM鍛戒護浼氬垎鏋愯鍗歌澆鐨勮蔣浠跺寘鐨勪緷璧栧叧緋伙紝褰撳瓨鍦ㄤ緷璧栧叧緋繪椂浼氳嚜鍔ㄥ仠姝紝騫舵樉鐢? 銆銆鍝釜杞歡閫犳垚鐨勫嵏杞藉け璐ャ傛牴鎹甊PM鎻愮ず鐨勯敊璇俊鎭紝紜畾鍏堝嵏杞界殑杞歡鍖咃紝鍐嶅嵏杞借渚濊禆鐨勮蔣浠跺寘銆?/p>
銆銆浣跨敤rpm鍛戒護鍗囩駭杞歡鍖咃細 銆銆$ rpm - U rpm瀹夎鍖呮枃浠跺悕 銆銆娉細"rpm -u"鍛戒護涓嬌鐢ㄧ殑鍗囩駭杞歡鍖呮枃浠舵渶濂戒嬌鐢≧ED HAT鍏徃閽堝褰撳墠鐨刲inux鐗堟湰瀹樻柟鎺ㄥ嚭鐨勫崌綰ф枃浠訛紝寤鴻涓嶈浣跨敤絎笁鏂規彁渚涚殑鍗囩駭鍖呫?/p>
銆銆緙栬瘧搴旂敤紼嬪簭鍓嶇殑鍑嗗宸ヤ綔錛?/strong> 銆銆1銆佺‘璁ょ郴緇熶腑宸茬粡瀹夎浜嗙紪璇戠幆澧?/p>
銆銆$ rpm -qa | grep gcc 銆銆紜畾褰撳墠緋葷粺涓畨瑁呬簡gcc緙栬瘧鍣ㄧ幆澧冦?/p>
銆銆2銆佷笅杞絧rozilla紼嬪簭鐨勬簮浠g爜瀹夎鍖呮枃浠?/p>
銆銆3銆侀噴鏀懼凡涓嬭澆鐨勬簮浠g爜杞歡鍖呮枃浠?/p>
銆銆$ tar jxf prozilla-2.0.4.tar.bz2 銆銆閲婃斁浠ヤ笅杞界殑婧愪唬鐮佽蔣浠跺寘鏂囦歡鍒板綋鍓嶇洰褰曘傝В鍘嬪悗鐨勬枃浠跺悕錛歱rozilla-2.0.4 銆銆鎵╁睍錛歵ar鐨剎zvf鍙傛暟鐢ㄤ簬閲婃斁浠ar.gz鏍煎紡鐨勫帇緙╁寘銆?/p>
銆銆4銆佽繘鍏ユ簮浠g爜鐩綍 銆銆$ cd prozilla-2.0.4 榪涘叆鐩綍銆?/p>
銆銆$ pwd 鏄劇ず褰撳墠鐩綍璺緞銆?/p>
銆銆/home/teacher/download/prozilla-2.0.4 鏄劇ず緇撴灉銆?/p>
銆銆緙栬瘧杞歡瀹夎鐨勮礬寰勶細 銆銆$ ./configure --prefix=/home/teacher/proz 銆銆鍦╬rozilla紼嬪簭鐨勯厤緗腑錛屼嬌鐢?--prdfix"閫夐」鍙互鎸囧畾搴旂敤紼嬪簭緙栬瘧鍚庣殑瀹夎璺緞錛屽鏋滀笉浣跨敤"--prefix" 銆銆閫夐」鎸囧畾瀹夎璺緞錛宑onfigure紼嬪簭灝嗛厤緗畃rozilla鐨勯粯璁ゅ畨瑁呰礬寰勪負"/usr/local/bin"鐩綍銆?/p>
銆銆5銆佺▼搴忕紪璇戣繃紼?/p>
銆銆$ make 銆銆浣跨敤make鍛戒護榪涜紼嬪簭鐨勪簩榪涘埗緙栬瘧銆?/p>
銆銆6銆佺▼搴忓畨瑁呰繃紼?/p>
銆銆$ make install 銆銆"make install"鍛戒護灝嗘寜鐓onfiguer鍛戒護鐨?--prefix"閫夐」涓瀹氱殑瀹夎璺緞灝嗗凡緙栬瘧瀹屾垚鐨勫簲鐢ㄧ▼搴忓畨瑁呭埌鐩爣鐩綍銆?/p>
銆銆7銆侀獙璇佺紪璇戝畨瑁呯殑紼嬪簭 銆銆$ ls /home/teacher/proz 銆銆瀵熺湅proz鏂囦歡澶逛腑鐨勬枃浠躲?/p>
銆銆bin include lib man share 銆銆緙栬瘧鍓嶇殑閰嶇疆 銆銆$ ./configure - - help 銆銆緙栬瘧涓庡畨瑁咃細 銆銆1銆佺▼搴忕紪璇戣繃紼?/p>
銆銆$ make 銆銆2銆佺▼搴忓畨瑁呰繃紼?/p>
銆銆$ make install 銆銆3銆侀獙璇佺紪璇戝畨瑁呯殑紼嬪簭 榛樿妯″紡鏄疌ommand,褰撴垜浠寜ESC閿悗錛屾帴鐫鍐嶈緭鍏?鍙鋒椂錛岃繘鍏ommand妯″紡
]]>
1銆佸畨瑁呬互rpm鏂瑰紡鎻愪緵鐨勮蔣浠?br>Rpm(the red hat package manager)鏄竴涓紑鏀劇殑杞歡鍖呯鐞嗙郴緇熴?br>鍔熻兘錛氬彲浠ュ畨瑁呭拰鍗歌澆RPM鍖呯殑杞歡
#rpm –ivh *.rpm 瀹夎RPM鍖咃紱
#rpm –ivh –force *.rpm 鍦ㄥ師鍏堝畨瑁呯殑鍩虹涓婂啀寮鴻瀹夎涓嬈★紱
#rpm –Uvh *.rpm 鍗囩駭rpm鍖?br>#rpm –qa 鏌ユ壘鍒楀嚭緋葷粺涓墍鏈夊畨瑁呯殑rpm鍖?br>#rpm –q sendmail錛氭煡鐪媠endmail鍖呯殑鎯呭喌
#rpm –ql sendmail:鏌ョ湅sendmail瀹夎鐨勪綅緗?br>#rpm –e *.rpm 鍗歌澆rpm鍖?br>#rpm - qlp name.rpm 鏌ョ湅name.rpm鏈夊摢浜涙枃浠?br>#rpm - qf name.rpm 鏌ョ湅宸茬粡瑁呭ソ鐨勬枃浠跺睘浜庡摢涓猺pm鍖?br>#rpm2cpio filename.rpm 浣跨敤“rpm2cpio”鏉ヤ粠RPM鏂囨。涓彁鍙栨枃浠?br>
2. 瀹夎浠ユ簮浠g爜鏂瑰紡鎻愪緵鐨勮蔣浠?br>錛?錛夈佽В鍖呰В鍘嬶細
#tar –xzvf *.tar.gz 瑙e寘瑙e帇鍚庝細鍦ㄥ綋鍓嶇洰褰曚笅寤虹珛涓涓瓙鐩綍,濡倄xxx
錛?錛夈?cd xxxx
錛?錛夈?./configure
錛?錛夈?make
錛?錛夈?make install
3.Find浣跨敤鑼冧緥
find . -name ls.txt
find . -name ls.txt –print
find / -name ‘c??’ –print
find / -name ‘f*’ –print
find . -name ‘f*’ –exec ls –l { } \;
find . -name f\* –ok rm { } \; 錛堜氦浜掑紡鎻愰棶錛?br>find . -perm 644 –mtime 4
find . -name ‘c??’ –o -name ‘d??’
4. grep
鍔熻兘錛氬湪鏂囦歡涓悳瀵誨尮閰嶇殑琛屽茍榪涜杈撳嚭
璇硶錛歡rep [鍙傛暟]<瑕佹壘鐨勫瓧涓?gt;<鍘熸枃浠?gt;
-num:杈撳嚭鍖歸厤琛屽墠鍚庡悇num琛岀殑鍐呭
-A num:杈撳嚭鍖歸厤琛屽悗num琛岀殑鍐呭
-B num:杈撳嚭鍖歸厤琛屽墠num琛岀殑鍐呭
-i錛氬拷鐣ュぇ灝忓啓鐨勫尯鍒?br>-v:鍙樉紺哄嚭閭d簺涓嶅寘鎷煇瀛椾覆鐨勮鍜屾枃浠訛紝鍜岄粯璁ょ殑鐩稿弽
5. mkdir
鍔熻兘錛氬垱寤轟竴涓洰褰曪紙綾諱技MSDOS涓嬬殑md鍛戒護錛夈?br>璇硶錛歮kdir [閫夐」] dir-name
- m 瀵規柊寤虹洰褰曡緗瓨鍙栨潈闄愩備篃鍙互鐢╟hmod鍛戒護璁劇疆銆?br>- p 鍙互鏄竴涓礬寰勫悕縐般傛鏃惰嫢璺緞涓殑鏌愪簺鐩綍灝氫笉瀛樺湪錛?nbsp;鍔犱笂姝ら夐」鍚庯紝 緋葷粺灝嗚嚜鍔ㄥ緩绔嬪ソ閭d簺灝氫笉瀛樺湪鐨勭洰褰曪紝鍗充竴嬈″彲浠ュ緩绔嬪涓洰褰曘?br>#mkdir –m a=rwx test
#mkdir –m u=rwx,g=rx,o=rx test1
#mkdir –m 755 test2
#mkdir –p test3/test4(test3鍜宼est4鍧囦負鏂扮洰褰曪級
6銆乺mdir
鍔熻兘錛氬垹闄ょ┖鐩綍銆?br>璇硶錛歳mdir [閫夐」] dir-name
- p 閫掑綊鍒犻櫎鐩綍dirname錛屽綋瀛愮洰褰曞垹闄ゅ悗鍏剁埗鐩綍涓虹┖鏃訛紝涔熶竴鍚岃鍒犻櫎銆?br>7銆乫ile
鍔熻兘錛氭煡鐪嬫枃浠剁被鍨?br>璇硶錛歠ile 鏂囦歡鍚?br>
8銆乧at
鍔熻兘錛氭煡鐪嬫枃鏈枃浠剁殑鍐呭
璇硶錛歝at 鏂囦歡鍚?br>9銆乵ore
鍔熻兘錛氬垎灞忔樉紺烘枃鏈枃浠剁殑鍐呭銆?br>10銆乴ess
鍔熻兘錛氭樉紺烘枃鏈枃浠剁殑鍐呭錛屽彲浣跨敤pageup鍜宲agedown涓婄炕欏典笅緲婚〉銆?br>
11銆乭ead
鍔熻兘錛氭煡鐪嬫枃浠剁殑寮澶撮儴鍒嗗唴瀹?br>璇硶錛歨ead [琛屾暟] 鏂囦歡鍚?br>鐢ㄦ硶錛?head test.txt:鏄劇ず鍓?0琛屽唴瀹?br>#head -20 test.txt 鏄劇ず鍓?0琛屽唴瀹廣?br>12銆乼ail
鍔熻兘錛氭煡鐪嬫枃浠剁殑緇撳熬閮ㄥ垎鍐呭銆?br>璇硶錛歵ail [琛屾暟] 鏂囦歡鍚?br>榛樿鐨勮鏁頒負10琛屻?br>
13銆乻ort
鍔熻兘錛氬鏂囨湰鏂囦歡涓殑鍚勮榪涜鎺掑簭
鐢ㄦ硶錛歴ort 鏂囦歡鍚?br>渚嬶細#sort 123.txt >456.txt 灝?23.txt鎺掑簭鍚庨噸瀹氬悜鍒?56.txt鏂囦歡涓?br>14銆乽niq
鍔熻兘錛氬皢閲嶅琛屼粠杈撳嚭鏂囦歡涓垹闄わ紝鍙暀涓嬫瘡鏉¤褰曠殑鍞竴鏍鋒湰
璇硶錛?nbsp;uniq 鏂囦歡鍚?br>#uniq 456.txt鏂囦歡涓殑閲嶅琛屽垹闄ゅ悗杈撳嚭
]]>
Command錛堝懡浠わ級妯″紡錛岀敤浜庤緭鍏ュ懡浠わ紱
Insert錛堟彃鍏ワ級妯″紡錛岀敤浜庢彃鍏ユ枃鏈紱
Visual錛堝彲瑙嗭級妯″紡錛岀敤浜庤鍖栫殑鐨勯珮浜茍閫夊畾姝f枃
:wq 寮哄埗鎬у啓鍏ユ枃浠跺茍閫鍑恒傚嵆浣挎枃浠舵病鏈夎淇敼涔熷己鍒跺啓鍏ワ紝騫舵洿鏂版枃浠剁殑淇敼鏃墮棿銆?br> :x 鍐欏叆鏂囦歡騫墮鍑恒備粎褰撴枃浠惰淇敼鏃舵墠鍐欏叆錛屽茍鏇存柊鏂囦歡淇敼鏃墮棿錛屽惁鍒欎笉浼氭洿鏂版枃浠朵慨鏀規椂闂淬?br> 榪欎袱鑰呬竴鑸儏鍐典笅娌′粈涔堜笉涓鏍鳳紝浣嗘槸鍦ㄧ紪紼嬫柟闈紝瀵圭紪杈戞簮鏂囦歡鍙兘浼氫駭鐢熼噸瑕佸獎鍝嶃傚洜涓烘枃浠跺嵆浣挎病鏈変慨鏀癸紝":wq"寮哄埗鏇存柊鏂囦歡鐨勪慨鏀規椂闂達紝榪欐牱浼氳make緙栬瘧鏁翠釜欏圭洰鏃朵互涓烘枃浠惰淇敼榪囦簡錛岀劧鍚庡氨寰楅噸鏂扮紪璇戦摼鎺ョ敓鎴愬彲鎵ц鏂囦歡銆傝繖鍙兘浼氫駭鐢熻浜鴻瑙g殑鍚庢灉錛屽綋鐒朵篃浜х敓浜嗕笉蹇呰鐨勭郴緇熻祫婧愯姳閿銆?span style="COLOR: red">寤鴻鐢?x
:w 淇濆瓨錛?br> :w filename 鍙﹀瓨涓篺ilename錛?br> :wq! 淇濆瓨閫鍑猴紱
:wq! filename 娉細浠ilename涓烘枃浠跺悕淇濆瓨鍚庨鍑猴紱
:q! 涓嶄繚瀛橀鍑猴紱
2
]]>
/* example.c*/
#include <stdio.h>
#include <pthread.h>
void thread(void)
{
銆int i;
銆for(i=0;i<3;i++)
銆銆printf("This is a pthread.n");
}
int main(void)
{
銆pthread_t id;
銆int i,ret;
銆ret=pthread_create(&id,NULL,(void *) thread,NULL);
銆if(ret!=0){
銆銆printf ("Create pthread error!n");
銆銆exit (1);
銆}
銆for(i=0;i<3;i++)
銆銆printf("This is the main process.n");
銆pthread_join(id,NULL);
銆return (0);
}
銆銆鎴戜滑緙栬瘧姝ょ▼搴忥細
gcc example1.c -lpthread -o example1
銆銆榪愯example1錛屾垜浠緱鍒板涓嬬粨鏋滐細
This is the main process.
This is a pthread.
This is the main process.
This is the main process.
This is a pthread.
This is a pthread.
銆銆鍐嶆榪愯錛屾垜浠彲鑳藉緱鍒板涓嬬粨鏋滐細
This is a pthread.
This is the main process.
This is a pthread.
This is the main process.
This is a pthread.
This is the main process.
銆銆鍓嶅悗涓ゆ緇撴灉涓嶄竴鏍鳳紝榪欐槸涓や釜綰跨▼浜夊ずCPU璧勬簮鐨勭粨鏋溿備笂闈㈢殑紺轟緥涓紝鎴戜滑浣跨敤鍒頒簡涓や釜鍑芥暟錛宲thread_create鍜宲thread_join錛屽茍澹版槑浜嗕竴涓猵thread_t鍨嬬殑鍙橀噺銆?br>
銆銆pthread_t鍦ㄥご鏂囦歡/usr/include/bits/pthreadtypes.h涓畾涔夛細
銆銆typedef unsigned long int pthread_t;
銆銆瀹冩槸涓涓嚎紼嬬殑鏍囪瘑絎︺傚嚱鏁皃thread_create鐢ㄦ潵鍒涘緩涓涓嚎紼嬶紝瀹冪殑鍘熷瀷涓猴細
extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,void *(*__start_routine) (void *), void *__arg));
銆銆絎竴涓弬鏁頒負鎸囧悜綰跨▼鏍囪瘑絎︾殑鎸囬拡錛岀浜屼釜鍙傛暟鐢ㄦ潵璁劇疆綰跨▼灞炴э紝絎笁涓弬鏁版槸綰跨▼榪愯鍑芥暟鐨勮搗濮嬪湴鍧錛屾渶鍚庝竴涓弬鏁版槸榪愯鍑芥暟鐨勫弬鏁般傝繖閲岋紝鎴戜滑鐨勫嚱鏁皌hread涓嶉渶瑕佸弬鏁幫紝鎵浠ユ渶鍚庝竴涓弬鏁拌涓虹┖鎸囬拡銆傜浜屼釜鍙傛暟鎴戜滑涔熻涓虹┖鎸囬拡錛岃繖鏍峰皢鐢熸垚榛樿灞炴х殑綰跨▼銆傚綰跨▼灞炴х殑璁懼畾鍜屼慨鏀規垜浠皢鍦ㄤ笅涓鑺傞槓榪般傚綋鍒涘緩綰跨▼鎴愬姛鏃訛紝鍑芥暟榪斿洖0錛岃嫢涓嶄負0鍒欒鏄庡垱寤虹嚎紼嬪け璐ワ紝甯歌鐨勯敊璇繑鍥炰唬鐮佷負EAGAIN鍜孍INVAL銆傚墠鑰呰〃紺虹郴緇熼檺鍒跺垱寤烘柊鐨勭嚎紼嬶紝渚嬪綰跨▼鏁扮洰榪囧浜嗭紱鍚庤呰〃紺虹浜屼釜鍙傛暟浠h〃鐨勭嚎紼嬪睘鎬у奸潪娉曘傚垱寤虹嚎紼嬫垚鍔熷悗錛屾柊鍒涘緩鐨勭嚎紼嬪垯榪愯鍙傛暟涓夊拰鍙傛暟鍥涚‘瀹氱殑鍑芥暟錛屽師鏉ョ殑綰跨▼鍒欑戶緇繍琛屼笅涓琛屼唬鐮併?
銆銆鍑芥暟pthread_join鐢ㄦ潵絳夊緟涓涓嚎紼嬬殑緇撴潫銆傚嚱鏁板師鍨嬩負錛?br>
銆銆extern int pthread_join __P ((pthread_t __th, void **__thread_return));
銆銆絎竴涓弬鏁頒負琚瓑寰呯殑綰跨▼鏍囪瘑絎︼紝絎簩涓弬鏁頒負涓涓敤鎴峰畾涔夌殑鎸囬拡錛屽畠鍙互鐢ㄦ潵瀛樺偍琚瓑寰呯嚎紼嬬殑榪斿洖鍊箋傝繖涓嚱鏁版槸涓涓嚎紼嬮樆濉炵殑鍑芥暟錛岃皟鐢ㄥ畠鐨勫嚱鏁板皢涓鐩寸瓑寰呭埌琚瓑寰呯殑綰跨▼緇撴潫涓烘錛屽綋鍑芥暟榪斿洖鏃訛紝琚瓑寰呯嚎紼嬬殑璧勬簮琚敹鍥炪備竴涓嚎紼嬬殑緇撴潫鏈変袱縐嶉斿緞錛屼竴縐嶆槸璞℃垜浠笂闈㈢殑渚嬪瓙涓鏍鳳紝鍑芥暟緇撴潫浜嗭紝璋冪敤瀹冪殑綰跨▼涔熷氨緇撴潫浜嗭紱鍙︿竴縐嶆柟寮忔槸閫氳繃鍑芥暟pthread_exit鏉ュ疄鐜般傚畠鐨勫嚱鏁板師鍨嬩負錛?br>
銆銆extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
銆銆鍞竴鐨勫弬鏁版槸鍑芥暟鐨勮繑鍥炰唬鐮侊紝鍙pthread_join涓殑絎簩涓弬鏁皌hread_return涓嶆槸NULL錛岃繖涓煎皢琚紶閫掔粰thread_return銆傛渶鍚庤璇存槑鐨勬槸錛屼竴涓嚎紼嬩笉鑳借澶氫釜綰跨▼絳夊緟錛屽惁鍒欑涓涓帴鏀跺埌淇″彿鐨勭嚎紼嬫垚鍔熻繑鍥烇紝鍏朵綑璋冪敤pthread_join鐨勭嚎紼嬪垯榪斿洖閿欒浠g爜ESRCH銆?br>
銆銆鍦ㄨ繖涓鑺傞噷錛屾垜浠紪鍐欎簡涓涓渶綆鍗曠殑綰跨▼錛屽茍鎺屾彙浜嗘渶甯哥敤鐨勪笁涓嚱鏁皃thread_create錛宲thread_join鍜宲thread_exit銆備笅闈紝鎴戜滑鏉ヤ簡瑙g嚎紼嬬殑涓浜涘父鐢ㄥ睘鎬т互鍙婂浣曡緗繖浜涘睘鎬с?br>
銆銆淇敼綰跨▼鐨勫睘鎬?/strong>
銆銆鍦ㄤ笂涓鑺傜殑渚嬪瓙閲岋紝鎴戜滑鐢╬thread_create鍑芥暟鍒涘緩浜嗕竴涓嚎紼嬶紝鍦ㄨ繖涓嚎紼嬩腑錛屾垜浠嬌鐢ㄤ簡榛樿鍙傛暟錛屽嵆灝嗚鍑芥暟鐨勭浜屼釜鍙傛暟璁句負NULL銆傜殑紜紝瀵瑰ぇ澶氭暟紼嬪簭鏉ヨ錛屼嬌鐢ㄩ粯璁ゅ睘鎬у氨澶熶簡錛屼絾鎴戜滑榪樻槸鏈夊繀瑕佹潵浜嗚В涓涓嬬嚎紼嬬殑鏈夊叧灞炴с?br>
銆銆灞炴х粨鏋勪負pthread_attr_t錛屽畠鍚屾牱鍦ㄥご鏂囦歡/usr/include/pthread.h涓畾涔夛紝鍠滄榪芥牴闂簳鐨勪漢鍙互鑷繁鍘繪煡鐪嬨傚睘鎬у間笉鑳界洿鎺ヨ緗紝欏諱嬌鐢ㄧ浉鍏沖嚱鏁拌繘琛屾搷浣滐紝鍒濆鍖栫殑鍑芥暟涓簆thread_attr_init錛岃繖涓嚱鏁板繀欏誨湪pthread_create鍑芥暟涔嬪墠璋冪敤銆傚睘鎬у璞′富瑕佸寘鎷槸鍚︾粦瀹氥佹槸鍚﹀垎紱匯佸爢鏍堝湴鍧銆佸爢鏍堝ぇ灝忋佷紭鍏堢駭銆傞粯璁ょ殑灞炴т負闈炵粦瀹氥侀潪鍒嗙銆佺己鐪?M鐨勫爢鏍堛佷笌鐖惰繘紼嬪悓鏍風駭鍒殑浼樺厛綰с?br>
銆銆鍏充簬綰跨▼鐨勭粦瀹氾紝鐗墊秹鍒板彟澶栦竴涓蹇碉細杞昏繘紼嬶紙LWP錛歀ight Weight Process錛夈傝交榪涚▼鍙互鐞嗚В涓哄唴鏍哥嚎紼嬶紝瀹冧綅浜庣敤鎴峰眰鍜岀郴緇熷眰涔嬮棿銆傜郴緇熷綰跨▼璧勬簮鐨勫垎閰嶃佸綰跨▼鐨勬帶鍒舵槸閫氳繃杞昏繘紼嬫潵瀹炵幇鐨勶紝涓涓交榪涚▼鍙互鎺у埗涓涓垨澶氫釜綰跨▼銆傞粯璁ょ姸鍐典笅錛屽惎鍔ㄥ灝戣交榪涚▼銆佸摢浜涜交榪涚▼鏉ユ帶鍒跺摢浜涚嚎紼嬫槸鐢辯郴緇熸潵鎺у埗鐨勶紝榪欑鐘跺喌鍗崇О涓洪潪緇戝畾鐨勩傜粦瀹氱姸鍐典笅錛屽垯欏懼悕鎬濅箟錛屽嵆鏌愪釜綰跨▼鍥哄畾鐨?緇?鍦ㄤ竴涓交榪涚▼涔嬩笂銆傝緇戝畾鐨勭嚎紼嬪叿鏈夎緝楂樼殑鍝嶅簲閫熷害錛岃繖鏄洜涓篊PU鏃墮棿鐗囩殑璋冨害鏄潰鍚戣交榪涚▼鐨勶紝緇戝畾鐨勭嚎紼嬪彲浠ヤ繚璇佸湪闇瑕佺殑鏃跺欏畠鎬繪湁涓涓交榪涚▼鍙敤銆傞氳繃璁劇疆琚粦瀹氱殑杞昏繘紼嬬殑浼樺厛綰у拰璋冨害綰у彲浠ヤ嬌寰楃粦瀹氱殑綰跨▼婊¤凍璇稿瀹炴椂鍙嶅簲涔嬬被鐨勮姹傘?br>
銆銆璁劇疆綰跨▼緇戝畾鐘舵佺殑鍑芥暟涓簆thread_attr_setscope錛屽畠鏈変袱涓弬鏁幫紝絎竴涓槸鎸囧悜灞炴х粨鏋勭殑鎸囬拡錛岀浜屼釜鏄粦瀹氱被鍨嬶紝瀹冩湁涓や釜鍙栧鹼細PTHREAD_SCOPE_SYSTEM錛堢粦瀹氱殑錛夊拰PTHREAD_SCOPE_PROCESS錛堥潪緇戝畾鐨勶級銆備笅闈㈢殑浠g爜鍗沖垱寤轟簡涓涓粦瀹氱殑綰跨▼銆?
#include <pthread.h>
pthread_attr_t attr;
pthread_t tid;
/*鍒濆鍖栧睘鎬у鹼紝鍧囪涓洪粯璁ゅ?/
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
pthread_create(&tid, &attr, (void *) my_function, NULL);
銆銆綰跨▼鐨勫垎紱葷姸鎬佸喅瀹氫竴涓嚎紼嬩互浠涔堟牱鐨勬柟寮忔潵緇堟鑷繁銆傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠噰鐢ㄤ簡綰跨▼鐨勯粯璁ゅ睘鎬э紝鍗充負闈炲垎紱葷姸鎬侊紝榪欑鎯呭喌涓嬶紝鍘熸湁鐨勭嚎紼嬬瓑寰呭垱寤虹殑綰跨▼緇撴潫銆傚彧鏈夊綋pthread_join錛堬級鍑芥暟榪斿洖鏃訛紝鍒涘緩鐨勭嚎紼嬫墠綆楃粓姝紝鎵嶈兘閲婃斁鑷繁鍗犵敤鐨勭郴緇熻祫婧愩傝屽垎紱葷嚎紼嬩笉鏄繖鏍峰瓙鐨勶紝瀹冩病鏈夎鍏朵粬鐨勭嚎紼嬫墍絳夊緟錛岃嚜宸辮繍琛岀粨鏉熶簡錛岀嚎紼嬩篃灝辯粓姝簡錛岄┈涓婇噴鏀劇郴緇熻祫婧愩傜▼搴忓憳搴旇鏍規嵁鑷繁鐨勯渶瑕侊紝閫夋嫨閫傚綋鐨勫垎紱葷姸鎬併傝緗嚎紼嬪垎紱葷姸鎬佺殑鍑芥暟涓簆thread_attr_setdetachstate錛坧thread_attr_t *attr, int detachstate錛夈傜浜屼釜鍙傛暟鍙変負PTHREAD_CREATE_DETACHED錛堝垎紱葷嚎紼嬶級鍜?PTHREAD _CREATE_JOINABLE錛堥潪鍒嗙綰跨▼錛夈傝繖閲岃娉ㄦ剰鐨勪竴鐐規槸錛屽鏋滆緗竴涓嚎紼嬩負鍒嗙綰跨▼錛岃岃繖涓嚎紼嬭繍琛屽張闈炲父蹇紝瀹冨緢鍙兘鍦╬thread_create鍑芥暟榪斿洖涔嬪墠灝辯粓姝簡錛屽畠緇堟浠ュ悗灝卞彲鑳藉皢綰跨▼鍙峰拰緋葷粺璧勬簮縐諱氦緇欏叾浠栫殑綰跨▼浣跨敤錛岃繖鏍瘋皟鐢╬thread_create鐨勭嚎紼嬪氨寰楀埌浜嗛敊璇殑綰跨▼鍙楓傝閬垮厤榪欑鎯呭喌鍙互閲囧彇涓瀹氱殑鍚屾鎺柦錛屾渶綆鍗曠殑鏂規硶涔嬩竴鏄彲浠ュ湪琚垱寤虹殑綰跨▼閲岃皟鐢╬thread_cond_timewait鍑芥暟錛岃榪欎釜綰跨▼絳夊緟涓浼氬効錛岀暀鍑鴻凍澶熺殑鏃墮棿璁╁嚱鏁皃thread_create榪斿洖銆傝緗竴孌電瓑寰呮椂闂達紝鏄湪澶氱嚎紼嬬紪紼嬮噷甯哥敤鐨勬柟娉曘備絾鏄敞鎰忎笉瑕佷嬌鐢ㄨ濡倃ait錛堬級涔嬬被鐨勫嚱鏁幫紝瀹冧滑鏄嬌鏁翠釜榪涚▼鐫$湢錛屽茍涓嶈兘瑙e喅綰跨▼鍚屾鐨勯棶棰樸?br>
銆銆鍙﹀涓涓彲鑳藉父鐢ㄧ殑灞炴ф槸綰跨▼鐨勪紭鍏堢駭錛屽畠瀛樻斁鍦ㄧ粨鏋剆ched_param涓傜敤鍑芥暟pthread_attr_getschedparam鍜屽嚱鏁皃thread_attr_setschedparam榪涜瀛樻斁錛屼竴鑸鏉ワ紝鎴戜滑鎬繪槸鍏堝彇浼樺厛綰э紝瀵瑰彇寰楃殑鍊間慨鏀瑰悗鍐嶅瓨鏀懼洖鍘匯備笅闈㈠嵆鏄竴孌電畝鍗曠殑渚嬪瓙銆?
綰跨▼鐨勬暟鎹鐞?br>
#include <pthread.h>
#include <sched.h>
pthread_attr_t attr;
pthread_t tid;
sched_param param;
int newprio=20;
pthread_attr_init(&attr);
pthread_attr_getschedparam(&attr, ¶m);
param.sched_priority=newprio;
pthread_attr_setschedparam(&attr, ¶m);
pthread_create(&tid, &attr, (void *)myfunction, myarg);
銆銆鍜岃繘紼嬬浉姣旓紝綰跨▼鐨勬渶澶т紭鐐逛箣涓鏄暟鎹殑鍏變韓鎬э紝鍚勪釜榪涚▼鍏變韓鐖惰繘紼嬪娌胯鐨勬暟鎹錛屽彲浠ユ柟渚跨殑鑾峰緱銆佷慨鏀規暟鎹備絾榪欎篃緇欏綰跨▼緙栫▼甯︽潵浜嗚澶氶棶棰樸傛垜浠繀欏誨綋蹇冩湁澶氫釜涓嶅悓鐨勮繘紼嬭闂浉鍚岀殑鍙橀噺銆傝澶氬嚱鏁版槸涓嶅彲閲嶅叆鐨勶紝鍗沖悓鏃朵笉鑳借繍琛屼竴涓嚱鏁扮殑澶氫釜鎷瘋礉錛堥櫎闈炰嬌鐢ㄤ笉鍚岀殑鏁版嵁孌碉級銆傚湪鍑芥暟涓0鏄庣殑闈欐佸彉閲忓父甯稿甫鏉ラ棶棰橈紝鍑芥暟鐨勮繑鍥炲間篃浼氭湁闂銆傚洜涓哄鏋滆繑鍥炵殑鏄嚱鏁板唴閮ㄩ潤鎬佸0鏄庣殑絀洪棿鐨勫湴鍧錛屽垯鍦ㄤ竴涓嚎紼嬭皟鐢ㄨ鍑芥暟寰楀埌鍦板潃鍚庝嬌鐢ㄨ鍦板潃鎸囧悜鐨勬暟鎹椂錛屽埆鐨勭嚎紼嬪彲鑳借皟鐢ㄦ鍑芥暟騫朵慨鏀逛簡榪欎竴孌墊暟鎹傚湪榪涚▼涓叡浜殑鍙橀噺蹇呴』鐢ㄥ叧閿瓧volatile鏉ュ畾涔夛紝榪欐槸涓轟簡闃叉緙栬瘧鍣ㄥ湪浼樺寲鏃訛紙濡俫cc涓嬌鐢?OX鍙傛暟錛夋敼鍙樺畠浠殑浣跨敤鏂瑰紡銆備負浜嗕繚鎶ゅ彉閲忥紝鎴戜滑蹇呴』浣跨敤淇″彿閲忋佷簰鏂ョ瓑鏂規硶鏉ヤ繚璇佹垜浠鍙橀噺鐨勬紜嬌鐢ㄣ備笅闈紝鎴戜滑灝遍愭浠嬬粛澶勭悊綰跨▼鏁版嵁鏃剁殑鏈夊叧鐭ヨ瘑銆?br>
銆銆1銆佺嚎紼嬫暟鎹?br>
銆銆鍦ㄥ崟綰跨▼鐨勭▼搴忛噷錛屾湁涓ょ鍩烘湰鐨勬暟鎹細鍏ㄥ眬鍙橀噺鍜屽眬閮ㄥ彉閲忋備絾鍦ㄥ綰跨▼紼嬪簭閲岋紝榪樻湁絎笁縐嶆暟鎹被鍨嬶細綰跨▼鏁版嵁錛圱SD: Thread-Specific Data錛夈傚畠鍜屽叏灞鍙橀噺寰堣薄錛屽湪綰跨▼鍐呴儴錛屽悇涓嚱鏁板彲浠ヨ薄浣跨敤鍏ㄥ眬鍙橀噺涓鏍瘋皟鐢ㄥ畠錛屼絾瀹冨綰跨▼澶栭儴鐨勫叾瀹冪嚎紼嬫槸涓嶅彲瑙佺殑銆傝繖縐嶆暟鎹殑蹇呰鎬ф槸鏄捐屾槗瑙佺殑銆備緥濡傛垜浠父瑙佺殑鍙橀噺errno錛屽畠榪斿洖鏍囧噯鐨勫嚭閿欎俊鎭傚畠鏄劇劧涓嶈兘鏄竴涓眬閮ㄥ彉閲忥紝鍑犱箮姣忎釜鍑芥暟閮藉簲璇ュ彲浠ヨ皟鐢ㄥ畠錛涗絾瀹冨張涓嶈兘鏄竴涓叏灞鍙橀噺錛屽惁鍒欏湪A綰跨▼閲岃緭鍑虹殑寰堝彲鑳芥槸B綰跨▼鐨勫嚭閿欎俊鎭傝瀹炵幇璇稿姝ょ被鐨勫彉閲忥紝鎴戜滑灝卞繀欏諱嬌鐢ㄧ嚎紼嬫暟鎹傛垜浠負姣忎釜綰跨▼鏁版嵁鍒涘緩涓涓敭錛屽畠鍜岃繖涓敭鐩稿叧鑱旓紝鍦ㄥ悇涓嚎紼嬮噷錛岄兘浣跨敤榪欎釜閿潵鎸囦唬綰跨▼鏁版嵁錛屼絾鍦ㄤ笉鍚岀殑綰跨▼閲岋紝榪欎釜閿唬琛ㄧ殑鏁版嵁鏄笉鍚岀殑錛屽湪鍚屼竴涓嚎紼嬮噷錛屽畠浠h〃鍚屾牱鐨勬暟鎹唴瀹廣?br>
銆銆鍜岀嚎紼嬫暟鎹浉鍏崇殑鍑芥暟涓昏鏈?涓細鍒涘緩涓涓敭錛涗負涓涓敭鎸囧畾綰跨▼鏁版嵁錛涗粠涓涓敭璇誨彇綰跨▼鏁版嵁錛涘垹闄ら敭銆?br>
銆銆鍒涘緩閿殑鍑芥暟鍘熷瀷涓猴細
銆銆
extern int pthread_key_create __P ((pthread_key_t *__key,void (*__destr_function) (void *)));
銆銆絎竴涓弬鏁頒負鎸囧悜涓涓敭鍊肩殑鎸囬拡錛岀浜屼釜鍙傛暟鎸囨槑浜嗕竴涓猟estructor鍑芥暟錛屽鏋滆繖涓弬鏁頒笉涓虹┖錛岄偅涔堝綋姣忎釜綰跨▼緇撴潫鏃訛紝緋葷粺灝嗚皟鐢ㄨ繖涓嚱鏁版潵閲婃斁緇戝畾鍦ㄨ繖涓敭涓婄殑鍐呭瓨鍧椼傝繖涓嚱鏁板父鍜屽嚱鏁皃thread_once ((pthread_once_t*once_control, void (*initroutine) (void)))涓璧蜂嬌鐢紝涓轟簡璁╄繖涓敭鍙鍒涘緩涓嬈°傚嚱鏁皃thread_once澹版槑涓涓垵濮嬪寲鍑芥暟錛岀涓嬈¤皟鐢╬thread_once鏃跺畠鎵ц榪欎釜鍑芥暟錛屼互鍚庣殑璋冪敤灝嗚瀹冨拷鐣ャ?br>
銆銆鍦ㄤ笅闈㈢殑渚嬪瓙涓紝鎴戜滑鍒涘緩涓涓敭錛屽茍灝嗗畠鍜屾煇涓暟鎹浉鍏寵仈銆傛垜浠瀹氫箟涓涓嚱鏁癱reateWindow錛岃繖涓嚱鏁板畾涔変竴涓浘褰㈢獥鍙o紙鏁版嵁綾誨瀷涓篎l_Window *錛岃繖鏄浘褰㈢晫闈㈠紑鍙戝伐鍏稦LTK涓殑鏁版嵁綾誨瀷錛夈傜敱浜庡悇涓嚎紼嬮兘浼氳皟鐢ㄨ繖涓嚱鏁幫紝鎵浠ユ垜浠嬌鐢ㄧ嚎紼嬫暟鎹?br>
/* 澹版槑涓涓敭*/
pthread_key_t myWinKey;
/* 鍑芥暟 createWindow */
void createWindow ( void ) {
銆Fl_Window * win;
銆static pthread_once_t once= PTHREAD_ONCE_INIT;
銆/* 璋冪敤鍑芥暟createMyKey錛屽垱寤洪敭*/
銆pthread_once ( & once, createMyKey) ;
銆/*win鎸囧悜涓涓柊寤虹珛鐨勭獥鍙?/
銆win=new Fl_Window( 0, 0, 100, 100, "MyWindow");
銆/* 瀵規紿楀彛浣滀竴浜涘彲鑳界殑璁劇疆宸ヤ綔錛屽澶у皬銆佷綅緗佸悕縐扮瓑*/
銆setWindow(win);
銆/* 灝嗙獥鍙f寚閽堝肩粦瀹氬湪閿甿yWinKey涓?/
銆pthread_setpecific ( myWinKey, win);
}
/* 鍑芥暟 createMyKey錛屽垱寤轟竴涓敭錛屽茍鎸囧畾浜哾estructor */
void createMyKey ( void ) {
銆pthread_keycreate(&myWinKey, freeWinKey);
}
/* 鍑芥暟 freeWinKey錛岄噴鏀劇┖闂?/
void freeWinKey ( Fl_Window * win){
銆delete win;
}
銆銆榪欐牱錛屽湪涓嶅悓鐨勭嚎紼嬩腑璋冪敤鍑芥暟createMyWin錛岄兘鍙互寰楀埌鍦ㄧ嚎紼嬪唴閮ㄥ潎鍙鐨勭獥鍙e彉閲忥紝榪欎釜鍙橀噺閫氳繃鍑芥暟pthread_getspecific寰楀埌銆傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠凡緇忎嬌鐢ㄤ簡鍑芥暟pthread_setspecific鏉ュ皢綰跨▼鏁版嵁鍜屼竴涓敭緇戝畾鍦ㄤ竴璧楓傝繖涓や釜鍑芥暟鐨勫師鍨嬪涓嬶細
銆銆extern int pthread_setspecific __P ((pthread_key_t __key,__const void *__pointer));
銆銆extern void *pthread_getspecific __P ((pthread_key_t __key));
銆銆榪欎袱涓嚱鏁扮殑鍙傛暟鎰忎箟鍜屼嬌鐢ㄦ柟娉曟槸鏄捐屾槗瑙佺殑銆傝娉ㄦ剰鐨勬槸錛岀敤pthread_setspecific涓轟竴涓敭鎸囧畾鏂扮殑綰跨▼鏁版嵁鏃訛紝蹇呴』鑷繁閲婃斁鍘熸湁鐨勭嚎紼嬫暟鎹互鍥炴敹絀洪棿銆傝繖涓繃紼嬪嚱鏁皃thread_key_delete鐢ㄦ潵鍒犻櫎涓涓敭錛岃繖涓敭鍗犵敤鐨勫唴瀛樺皢琚噴鏀撅紝浣嗗悓鏍瘋娉ㄦ剰鐨勬槸錛屽畠鍙噴鏀鵑敭鍗犵敤鐨勫唴瀛橈紝騫朵笉閲婃斁璇ラ敭鍏寵仈鐨勭嚎紼嬫暟鎹墍鍗犵敤鐨勫唴瀛樿祫婧愶紝鑰屼笖瀹冧篃涓嶄細瑙﹀彂鍑芥暟pthread_key_create涓畾涔夌殑destructor鍑芥暟銆傜嚎紼嬫暟鎹殑閲婃斁蹇呴』鍦ㄩ噴鏀鵑敭涔嬪墠瀹屾垚銆?br>
銆銆2銆佷簰鏂ラ攣
銆銆浜掓枼閿佺敤鏉ヤ繚璇佷竴孌墊椂闂村唴鍙湁涓涓嚎紼嬪湪鎵ц涓孌典唬鐮併傚繀瑕佹ф樉鑰屾槗瑙侊細鍋囪鍚勪釜綰跨▼鍚戝悓涓涓枃浠墮『搴忓啓鍏ユ暟鎹紝鏈鍚庡緱鍒扮殑緇撴灉涓瀹氭槸鐏鵑毦鎬х殑銆?br>
銆銆鎴戜滑鍏堢湅涓嬮潰涓孌典唬鐮併傝繖鏄竴涓/鍐欑▼搴忥紝瀹冧滑鍏敤涓涓紦鍐插尯錛屽茍涓旀垜浠亣瀹氫竴涓紦鍐插尯鍙兘淇濆瓨涓鏉′俊鎭傚嵆緙撳啿鍖哄彧鏈変袱涓姸鎬侊細鏈変俊鎭垨娌℃湁淇℃伅銆?br>
void reader_function ( void );
void writer_function ( void );
char buffer;
int buffer_has_item=0;
pthread_mutex_t mutex;
struct timespec delay;
void main ( void ){
銆pthread_t reader;
銆/* 瀹氫箟寤惰繜鏃墮棿*/
銆delay.tv_sec = 2;
銆delay.tv_nec = 0;
銆/* 鐢ㄩ粯璁ゅ睘鎬у垵濮嬪寲涓涓簰鏂ラ攣瀵硅薄*/
銆pthread_mutex_init (&mutex,NULL);
銆pthread_create(&reader, pthread_attr_default, (void *)&reader_function), NULL);
銆writer_function( );
}
void writer_function (void){
銆while(1){
銆銆/* 閿佸畾浜掓枼閿?/
銆銆pthread_mutex_lock (&mutex);
銆銆if (buffer_has_item==0){
銆銆銆buffer=make_new_item( );
銆銆銆buffer_has_item=1;
銆銆}
銆銆/* 鎵撳紑浜掓枼閿?/
銆銆pthread_mutex_unlock(&mutex);
銆銆pthread_delay_np(&delay);
銆}
}
void reader_function(void){
銆while(1){
銆銆pthread_mutex_lock(&mutex);
銆銆if(buffer_has_item==1){
銆銆銆consume_item(buffer);
銆銆銆buffer_has_item=0;
銆銆}
銆銆pthread_mutex_unlock(&mutex);
銆銆pthread_delay_np(&delay);
銆}
}
銆銆榪欓噷澹版槑浜嗕簰鏂ラ攣鍙橀噺mutex錛岀粨鏋刾thread_mutex_t涓轟笉鍏紑鐨勬暟鎹被鍨嬶紝鍏朵腑鍖呭惈涓涓郴緇熷垎閰嶇殑灞炴у璞°傚嚱鏁皃thread_mutex_init鐢ㄦ潵鐢熸垚涓涓簰鏂ラ攣銆侼ULL鍙傛暟琛ㄦ槑浣跨敤榛樿灞炴с傚鏋滈渶瑕佸0鏄庣壒瀹氬睘鎬х殑浜掓枼閿侊紝欏昏皟鐢ㄥ嚱鏁皃thread_mutexattr_init銆傚嚱鏁皃thread_mutexattr_setpshared鍜屽嚱鏁皃thread_mutexattr_settype鐢ㄦ潵璁劇疆浜掓枼閿佸睘鎬с傚墠涓涓嚱鏁拌緗睘鎬shared錛屽畠鏈変袱涓彇鍊鹼紝PTHREAD_PROCESS_PRIVATE鍜孭THREAD_PROCESS_SHARED銆傚墠鑰呯敤鏉ヤ笉鍚岃繘紼嬩腑鐨勭嚎紼嬪悓姝ワ紝鍚庤呯敤浜庡悓姝ユ湰榪涚▼鐨勪笉鍚岀嚎紼嬨傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠嬌鐢ㄧ殑鏄粯璁ゅ睘鎬THREAD_PROCESS_ PRIVATE銆傚悗鑰呯敤鏉ヨ緗簰鏂ラ攣綾誨瀷錛屽彲閫夌殑綾誨瀷鏈塒THREAD_MUTEX_NORMAL銆丳THREAD_MUTEX_ERRORCHECK銆丳THREAD_MUTEX_RECURSIVE鍜孭THREAD _MUTEX_DEFAULT銆傚畠浠垎鍒畾涔変簡涓嶅悓鐨勪笂鎵銆佽В閿佹満鍒訛紝涓鑸儏鍐典笅錛岄夌敤鏈鍚庝竴涓粯璁ゅ睘鎬с?br>
銆銆pthread_mutex_lock澹版槑寮濮嬬敤浜掓枼閿佷笂閿侊紝姝ゅ悗鐨勪唬鐮佺洿鑷寵皟鐢╬thread_mutex_unlock涓烘錛屽潎琚笂閿侊紝鍗沖悓涓鏃墮棿鍙兘琚竴涓嚎紼嬭皟鐢ㄦ墽琛屻傚綋涓涓嚎紼嬫墽琛屽埌pthread_mutex_lock澶勬椂錛屽鏋滆閿佹鏃惰鍙︿竴涓嚎紼嬩嬌鐢紝閭f綰跨▼琚樆濉烇紝鍗崇▼搴忓皢絳夊緟鍒板彟涓涓嚎紼嬮噴鏀炬浜掓枼閿併傚湪涓婇潰鐨勪緥瀛愪腑錛屾垜浠嬌鐢ㄤ簡pthread_delay_np鍑芥暟錛岃綰跨▼鐫$湢涓孌墊椂闂達紝灝辨槸涓轟簡闃叉涓涓嚎紼嬪緇堝崰鎹鍑芥暟銆?br>
銆銆涓婇潰鐨勪緥瀛愰潪甯哥畝鍗曪紝灝變笉鍐嶄粙緇嶄簡錛岄渶瑕佹彁鍑虹殑鏄湪浣跨敤浜掓枼閿佺殑榪囩▼涓緢鏈夊彲鑳戒細鍑虹幇姝婚攣錛氫袱涓嚎紼嬭瘯鍥懼悓鏃跺崰鐢ㄤ袱涓祫婧愶紝騫舵寜涓嶅悓鐨勬搴忛攣瀹氱浉搴旂殑浜掓枼閿侊紝渚嬪涓や釜綰跨▼閮介渶瑕侀攣瀹氫簰鏂ラ攣1鍜屼簰鏂ラ攣2錛宎綰跨▼鍏堥攣瀹氫簰鏂ラ攣1錛宐綰跨▼鍏堥攣瀹氫簰鏂ラ攣2錛岃繖鏃跺氨鍑虹幇浜嗘閿併傛鏃舵垜浠彲浠ヤ嬌鐢ㄥ嚱鏁皃thread_mutex_trylock錛屽畠鏄嚱鏁皃thread_mutex_lock鐨勯潪闃誨鐗堟湰錛屽綋瀹冨彂鐜版閿佷笉鍙伩鍏嶆椂錛屽畠浼氳繑鍥炵浉搴旂殑淇℃伅錛岀▼搴忓憳鍙互閽堝姝婚攣鍋氬嚭鐩稿簲鐨勫鐞嗐傚彟澶栦笉鍚岀殑浜掓枼閿佺被鍨嬪姝婚攣鐨勫鐞嗕笉涓鏍鳳紝浣嗘渶涓昏鐨勮繕鏄紼嬪簭鍛樿嚜宸卞湪紼嬪簭璁捐娉ㄦ剰榪欎竴鐐廣?br>
銆銆3銆佹潯浠跺彉閲?br>
銆銆鍓嶄竴鑺備腑鎴戜滑璁茶堪浜嗗浣曚嬌鐢ㄤ簰鏂ラ攣鏉ュ疄鐜扮嚎紼嬮棿鏁版嵁鐨勫叡浜拰閫氫俊錛屼簰鏂ラ攣涓涓槑鏄劇殑緙虹偣鏄畠鍙湁涓ょ鐘舵侊細閿佸畾鍜岄潪閿佸畾銆傝屾潯浠跺彉閲忛氳繃鍏佽綰跨▼闃誨鍜岀瓑寰呭彟涓涓嚎紼嬪彂閫佷俊鍙風殑鏂規硶寮ヨˉ浜嗕簰鏂ラ攣鐨勪笉瓚籌紝瀹冨父鍜屼簰鏂ラ攣涓璧蜂嬌鐢ㄣ備嬌鐢ㄦ椂錛屾潯浠跺彉閲忚鐢ㄦ潵闃誨涓涓嚎紼嬶紝褰撴潯浠朵笉婊¤凍鏃訛紝綰跨▼寰寰瑙e紑鐩稿簲鐨勪簰鏂ラ攣騫剁瓑寰呮潯浠跺彂鐢熷彉鍖栥備竴鏃﹀叾瀹冪殑鏌愪釜綰跨▼鏀瑰彉浜嗘潯浠跺彉閲忥紝瀹冨皢閫氱煡鐩稿簲鐨勬潯浠跺彉閲忓敜閱掍竴涓垨澶氫釜姝h姝ゆ潯浠跺彉閲忛樆濉炵殑綰跨▼銆傝繖浜涚嚎紼嬪皢閲嶆柊閿佸畾浜掓枼閿佸茍閲嶆柊嫻嬭瘯鏉′歡鏄惁婊¤凍銆備竴鑸鏉ワ紝鏉′歡鍙橀噺琚敤鏉ヨ繘琛岀嚎鎵塊棿鐨勫悓姝ャ?
銆銆鏉′歡鍙橀噺鐨勭粨鏋勪負pthread_cond_t錛屽嚱鏁皃thread_cond_init錛堬級琚敤鏉ュ垵濮嬪寲涓涓潯浠跺彉閲忋傚畠鐨勫師鍨嬩負錛?br>
銆銆extern int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr));
銆銆鍏朵腑cond鏄竴涓寚鍚戠粨鏋刾thread_cond_t鐨勬寚閽堬紝cond_attr鏄竴涓寚鍚戠粨鏋刾thread_condattr_t鐨勬寚閽堛傜粨鏋刾thread_condattr_t鏄潯浠跺彉閲忕殑灞炴х粨鏋勶紝鍜屼簰鏂ラ攣涓鏍鋒垜浠彲浠ョ敤瀹冩潵璁劇疆鏉′歡鍙橀噺鏄繘紼嬪唴鍙敤榪樻槸榪涚▼闂村彲鐢紝榛樿鍊兼槸PTHREAD_ PROCESS_PRIVATE錛屽嵆姝ゆ潯浠跺彉閲忚鍚屼竴榪涚▼鍐呯殑鍚勪釜綰跨▼浣跨敤銆傛敞鎰忓垵濮嬪寲鏉′歡鍙橀噺鍙湁鏈浣跨敤鏃舵墠鑳介噸鏂板垵濮嬪寲鎴栬閲婃斁銆傞噴鏀句竴涓潯浠跺彉閲忕殑鍑芥暟涓簆thread_cond_ destroy錛坧thread_cond_t cond錛夈傘
銆銆鍑芥暟pthread_cond_wait錛堬級浣跨嚎紼嬮樆濉炲湪涓涓潯浠跺彉閲忎笂銆傚畠鐨勫嚱鏁板師鍨嬩負錛?br>
銆銆extern int pthread_cond_wait __P ((pthread_cond_t *__cond,pthread_mutex_t *__mutex));
銆銆綰跨▼瑙e紑mutex鎸囧悜鐨勯攣騫惰鏉′歡鍙橀噺cond闃誨銆傜嚎紼嬪彲浠ヨ鍑芥暟pthread_cond_signal鍜屽嚱鏁皃thread_cond_broadcast鍞ら啋錛屼絾鏄娉ㄦ剰鐨勬槸錛屾潯浠跺彉閲忓彧鏄搗闃誨鍜屽敜閱掔嚎紼嬬殑浣滅敤錛屽叿浣撶殑鍒ゆ柇鏉′歡榪橀渶鐢ㄦ埛緇欏嚭錛屼緥濡備竴涓彉閲忔槸鍚︿負0絳夌瓑錛岃繖涓鐐規垜浠粠鍚庨潰鐨勪緥瀛愪腑鍙互鐪嬪埌銆傜嚎紼嬭鍞ら啋鍚庯紝瀹冨皢閲嶆柊媯鏌ュ垽鏂潯浠舵槸鍚︽弧瓚籌紝濡傛灉榪樹笉婊¤凍錛屼竴鑸鏉ョ嚎紼嬪簲璇ヤ粛闃誨鍦ㄨ繖閲岋紝琚瓑寰呰涓嬩竴嬈″敜閱掋傝繖涓繃紼嬩竴鑸敤while璇彞瀹炵幇銆?br>
銆銆鍙︿竴涓敤鏉ラ樆濉炵嚎紼嬬殑鍑芥暟鏄痯thread_cond_timedwait錛堬級錛屽畠鐨勫師鍨嬩負錛?br>銆銆extern int pthread_cond_timedwait __P ((pthread_cond_t *__cond,pthread_mutex_t *__mutex, __const struct timespec *__abstime));
銆銆瀹冩瘮鍑芥暟pthread_cond_wait錛堬級澶氫簡涓涓椂闂村弬鏁幫紝緇忓巻abstime孌墊椂闂村悗錛屽嵆浣挎潯浠跺彉閲忎笉婊¤凍錛岄樆濉炰篃琚В闄ゃ?br>
銆銆鍑芥暟pthread_cond_signal錛堬級鐨勫師鍨嬩負錛?br>
銆銆extern int pthread_cond_signal __P ((pthread_cond_t *__cond));
銆銆瀹冪敤鏉ラ噴鏀捐闃誨鍦ㄦ潯浠跺彉閲廲ond涓婄殑涓涓嚎紼嬨傚涓嚎紼嬮樆濉炲湪姝ゆ潯浠跺彉閲忎笂鏃訛紝鍝竴涓嚎紼嬭鍞ら啋鏄敱綰跨▼鐨勮皟搴︾瓥鐣ユ墍鍐沖畾鐨勩傝娉ㄦ剰鐨勬槸錛屽繀欏葷敤淇濇姢鏉′歡鍙橀噺鐨勪簰鏂ラ攣鏉ヤ繚鎶よ繖涓嚱鏁幫紝鍚﹀垯鏉′歡婊¤凍淇″彿鍙堝彲鑳藉湪嫻嬭瘯鏉′歡鍜岃皟鐢╬thread_cond_wait鍑芥暟涔嬮棿琚彂鍑猴紝浠庤岄犳垚鏃犻檺鍒剁殑絳夊緟銆備笅闈㈡槸浣跨敤鍑芥暟pthread_cond_wait錛堬級鍜屽嚱鏁皃thread_cond_signal錛堬級鐨勪竴涓畝鍗曠殑渚嬪瓙銆?br>
pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count;
decrement_count銆() {
銆pthread_mutex_lock (&count_lock);
銆while(count==0)
銆銆pthread_cond_wait( &count_nonzero, &count_lock);
銆銆count=count -1;
銆pthread_mutex_unlock (&count_lock);
}
increment_count(){
銆pthread_mutex_lock(&count_lock);
銆if(count==0)
銆銆pthread_cond_signal(&count_nonzero);
銆銆count=count+1;
銆pthread_mutex_unlock(&count_lock);
}
銆銆count鍊間負0鏃訛紝decrement鍑芥暟鍦╬thread_cond_wait澶勮闃誨錛屽茍鎵撳紑浜掓枼閿乧ount_lock銆傛鏃訛紝褰撹皟鐢ㄥ埌鍑芥暟increment_count鏃訛紝pthread_cond_signal錛堬級鍑芥暟鏀瑰彉鏉′歡鍙橀噺錛屽憡鐭ecrement_count錛堬級鍋滄闃誨銆傝鑰呭彲浠ヨ瘯鐫璁╀袱涓嚎紼嬪垎鍒繍琛岃繖涓や釜鍑芥暟錛岀湅鐪嬩細鍑虹幇浠涔堟牱鐨勭粨鏋溿?br>
銆銆鍑芥暟pthread_cond_broadcast錛坧thread_cond_t *cond錛夌敤鏉ュ敜閱掓墍鏈夎闃誨鍦ㄦ潯浠跺彉閲廲ond涓婄殑綰跨▼銆傝繖浜涚嚎紼嬭鍞ら啋鍚庡皢鍐嶆绔炰簤鐩稿簲鐨勪簰鏂ラ攣錛屾墍浠ュ繀欏誨皬蹇冧嬌鐢ㄨ繖涓嚱鏁般?br>
銆銆4銆佷俊鍙烽噺
銆銆淇″彿閲忔湰璐ㄤ笂鏄竴涓潪璐熺殑鏁存暟璁℃暟鍣紝瀹冭鐢ㄦ潵鎺у埗瀵瑰叕鍏辮祫婧愮殑璁塊棶銆傚綋鍏叡璧勬簮澧炲姞鏃訛紝璋冪敤鍑芥暟sem_post錛堬級澧炲姞淇″彿閲忋傚彧鏈夊綋淇″彿閲忓煎ぇ浜庯紣鏃訛紝鎵嶈兘浣跨敤鍏叡璧勬簮錛屼嬌鐢ㄥ悗錛屽嚱鏁皊em_wait錛堬級鍑忓皯淇″彿閲忋傚嚱鏁皊em_trywait錛堬級鍜屽嚱鏁皃thread_ mutex_trylock錛堬級璧峰悓鏍風殑浣滅敤錛屽畠鏄嚱鏁皊em_wait錛堬級鐨勯潪闃誨鐗堟湰銆備笅闈㈡垜浠愪釜浠嬬粛鍜屼俊鍙烽噺鏈夊叧鐨勪竴浜涘嚱鏁幫紝瀹冧滑閮藉湪澶存枃浠?usr/include/semaphore.h涓畾涔夈?br>
銆銆淇″彿閲忕殑鏁版嵁綾誨瀷涓虹粨鏋剆em_t錛屽畠鏈川涓婃槸涓涓暱鏁村瀷鐨勬暟銆傚嚱鏁皊em_init錛堬級鐢ㄦ潵鍒濆鍖栦竴涓俊鍙烽噺銆傚畠鐨勫師鍨嬩負錛?br>
銆銆extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
銆銆sem涓烘寚鍚戜俊鍙烽噺緇撴瀯鐨勪竴涓寚閽堬紱pshared涓嶄負錛愭椂姝や俊鍙烽噺鍦ㄨ繘紼嬮棿鍏變韓錛屽惁鍒欏彧鑳戒負褰撳墠榪涚▼鐨勬墍鏈夌嚎紼嬪叡浜紱value緇欏嚭浜嗕俊鍙烽噺鐨勫垵濮嬪箋?br>
銆銆鍑芥暟sem_post( sem_t *sem )鐢ㄦ潵澧炲姞淇″彿閲忕殑鍊箋傚綋鏈夌嚎紼嬮樆濉炲湪榪欎釜淇″彿閲忎笂鏃訛紝璋冪敤榪欎釜鍑芥暟浼氫嬌鍏朵腑鐨勪竴涓嚎紼嬩笉鍦ㄩ樆濉烇紝閫夋嫨鏈哄埗鍚屾牱鏄敱綰跨▼鐨勮皟搴︾瓥鐣ュ喅瀹氱殑銆?br>
銆銆鍑芥暟sem_wait( sem_t *sem )琚敤鏉ラ樆濉炲綋鍓嶇嚎紼嬬洿鍒頒俊鍙烽噺sem鐨勫煎ぇ浜?錛岃В闄ら樆濉炲悗灝唖em鐨勫煎噺涓錛岃〃鏄庡叕鍏辮祫婧愮粡浣跨敤鍚庡噺灝戙傚嚱鏁皊em_trywait ( sem_t *sem )鏄嚱鏁皊em_wait錛堬級鐨勯潪闃誨鐗堟湰錛屽畠鐩存帴灝嗕俊鍙烽噺sem鐨勫煎噺涓銆?br>
銆銆鍑芥暟sem_destroy(sem_t *sem)鐢ㄦ潵閲婃斁淇″彿閲弒em銆?br>
銆銆涓嬮潰鎴戜滑鏉ョ湅涓涓嬌鐢ㄤ俊鍙烽噺鐨勪緥瀛愩傚湪榪欎釜渚嬪瓙涓紝涓鍏辨湁4涓嚎紼嬶紝鍏朵腑涓や釜綰跨▼璐熻矗浠庢枃浠惰鍙栨暟鎹埌鍏叡鐨勭紦鍐插尯錛屽彟涓や釜綰跨▼浠庣紦鍐插尯璇誨彇鏁版嵁浣滀笉鍚岀殑澶勭悊錛堝姞鍜屼箻榪愮畻錛夈?br>
/* File sem.c */
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAXSTACK 100
int stack[MAXSTACK][2];
int size=0;
sem_t sem;
/* 浠庢枃浠?.dat璇誨彇鏁版嵁錛屾瘡璇諱竴嬈★紝淇″彿閲忓姞涓*/
void ReadData1(void){
銆FILE *fp=fopen("1.dat","r");
銆while(!feof(fp)){
銆銆fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
銆銆sem_post(&sem);
銆銆++size;
銆}
銆fclose(fp);
}
/*浠庢枃浠?.dat璇誨彇鏁版嵁*/
void ReadData2(void){
銆FILE *fp=fopen("2.dat","r");
銆while(!feof(fp)){
銆銆fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
銆銆sem_post(&sem);
銆銆++size;
銆}
銆fclose(fp);
}
/*闃誨絳夊緟緙撳啿鍖烘湁鏁版嵁錛岃鍙栨暟鎹悗錛岄噴鏀劇┖闂達紝緇х畫絳夊緟*/
void HandleData1(void){
銆while(1){
銆銆sem_wait(&sem);
銆銆printf("Plus:%d+%d=%dn",stack[size][0],stack[size][1],
銆銆stack[size][0]+stack[size][1]);
銆銆--size;
銆}
}
void HandleData2(void){
銆while(1){
銆銆sem_wait(&sem);
銆銆printf("Multiply:%d*%d=%dn",stack[size][0],stack[size][1],
銆銆stack[size][0]*stack[size][1]);
銆銆--size;
銆}
}
int main(void){
銆pthread_t t1,t2,t3,t4;
銆sem_init(&sem,0,0);
銆pthread_create(&t1,NULL,(void *)HandleData1,NULL);
銆pthread_create(&t2,NULL,(void *)HandleData2,NULL);
銆pthread_create(&t3,NULL,(void *)ReadData1,NULL);
銆pthread_create(&t4,NULL,(void *)ReadData2,NULL);
銆/* 闃叉紼嬪簭榪囨棭閫鍑猴紝璁╁畠鍦ㄦ鏃犻檺鏈熺瓑寰?/
銆pthread_join(t1,NULL);
}
銆銆鍦↙inux涓嬶紝鎴戜滑鐢ㄥ懡浠cc -lpthread sem.c -o sem鐢熸垚鍙墽琛屾枃浠秙em銆?鎴戜滑浜嬪厛緙栬緫濂芥暟鎹枃浠?.dat鍜?.dat錛屽亣璁懼畠浠殑鍐呭鍒嗗埆涓? 2 3 4 5 6 7 8 9 10鍜?-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 錛屾垜浠繍琛宻em錛屽緱鍒板涓嬬殑緇撴灉錛?br>
Multiply:-1*-2=2
Plus:-1+-2=-3
Multiply:9*10=90
Plus:-9+-10=-19
Multiply:-7*-8=56
Plus:-5+-6=-11
Multiply:-3*-4=12
Plus:9+10=19
Plus:7+8=15
Plus:5+6=11
銆銆浠庝腑鎴戜滑鍙互鐪嬪嚭鍚勪釜綰跨▼闂寸殑绔炰簤鍏崇郴銆傝屾暟鍊煎茍鏈寜鎴戜滑鍘熷厛鐨勯『搴忔樉紺哄嚭鏉ヨ繖鏄敱浜巗ize榪欎釜鏁板艱鍚勪釜綰跨▼浠繪剰淇敼鐨勭紭鏁呫傝繖涔熷線寰鏄綰跨▼緙栫▼瑕佹敞鎰忕殑闂銆?br>
]]>
鐢ㄨ鍏鋒湁浜茬紭鍏崇郴榪涚▼闂寸殑閫氫俊
鍖垮悕涓嬈℃т嬌鐢ㄧ殑錛屽崐鍙屽伐銆備竴涓繘紼嬪線杈撳嚭绔啓綆¢亾錛屽彟涓涓繘紼嬩粠杈撳叆绔綆¢亾銆?br> #include<unistd.h>
int pipe(int fd[2]);
fd[0]:琛ㄧず璇葷
fd[1]:琛ㄧず鍐欑
2銆佹湁鍚嶇閬?named pipe)
鍏佽鏃犱翰緙樺叧緋昏繘紼嬮棿鐨勯氫俊
鏈夊悕綆¢亾錛屼綔涓虹壒鍒枃浠跺瓨鍌ㄤ簬鏂囦歡緋葷粺涓傛湁鍚嶇閬撲竴鏃﹀緩绔嬪氨瀛樺湪浜庢枃浠剁郴緇熶腑錛岄櫎闈炴樉紺虹殑unlink
#include<sys/tpes.h>
#include<sys/stat.h>
int mknod(const char *path,mode_t mod,dev_t dev);
int mkfifo(const char *path,mode_t mode);
path:鍒涘緩鏈夊悕綆¢亾鐨勫叏璺緞鍚?br> mod:鍒涘緩鏈夊悕綆¢亾鐨勬ā寮忥紝鎸囧瓨鍙栨潈闄?br> dev:璁懼鍊鹼紝璇ュ煎彇鍐充簬鏂囦歡鍒涘緩鐨勭綾伙紝瀹冨彧鍦ㄥ垱寤鴻澶囨枃浠舵椂鎵嶄細鐢ㄥ埌
娉ㄦ剰:鏈夊悕綆¢亾鍒涘緩鍚庡氨鍙互浣跨敤浜嗭紝鏈夊悕綆¢亾鍜岀閬撶殑浣跨敤鏂規硶鍩烘湰鏄浉鍚岀殑銆傚彧鏄嬌鐢ㄦ湁鍚嶇閬撶殑鏃跺欏繀欏誨厛璋冪敤open()灝嗗叾鎵撳紑
鍥犱負鏈夊悕綆¢亾鏄竴涓瓨鍦ㄤ簬紜洏涓婄殑鏂囦歡錛岃岀閬撴槸瀛樺湪浜庡唴瀛樹腑鐨勭壒孌婃枃浠?/p>
涓嬮潰鐨勭▼搴忎竴涓綆¢亾錛屽彟涓涓啓綆¢亾錛岃繖涓や釜鍑芥暟鐢ㄧ殑鏄潪闃誨璇誨啓綆¢亾
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO "/tmp/myfifo"
main(int argc, char** argv)
{
char buf_r[100];
int fd;
int nread;
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
printf("cannot create fifoserver\n");
printf("Preparing for reading bytes...\n");
memset(buf_r,0,sizeof(buf_r));
fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(fd==-1)
{
perror("open");
exit(1);
}
while(1)
{
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-1){
if(errno==EAGAIN)
printf("no data yet\n");
}
printf("read %s from FIFO\n",buf_r);
sleep(1);
}
pause();
unlink(FIFO);
}
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO "/tmp/myfifo"
main(int argc,char** argv)
{
int fd;
char w_buf[100];
int nwrite;
if(fd==-1)
if(errno==ENXIO)
printf("open error; no reading process\n");
fd=open(FIFO,O_WRONLY|O_NONBLOCK,0);
if(argc==1)
printf("Please send something\n");
strcpy(w_buf,argv[1]);
if((nwrite=write(fd,w_buf,100))==-1)
{
if(errno==EAGAIN)
printf("The FIFO has not been read yet.Please try later\n");
}
else
printf("write %s to the FIFO\n",w_buf);
}
3銆佷俊鍙烽噺
涓昏鐢ㄤ簬榪涚▼闂村強鍚屼竴榪涚▼涓嶅悓綰跨▼涔嬮棿鐨勫悓姝ユ墜孌?/p>
4銆佹秷鎭槦鍒?/p>
鍏嬫湇淇″彿閲忔湁闄愶紝鍙啓鍙
5銆佷俊鍙鳳紙Signal錛?/p>
姣旇緝澶嶆潅錛岀敤浜庨氱煡鎺ュ彈榪涚▼鏈夋煇浜嬪彂鐢?/p>
6銆佸叡浜唴瀛?/p>
鏈鏈夌敤鐨勮繘紼嬮棿閫氫俊鏂瑰紡錛屼嬌寰楀涓繘紼嬪彲璁塊棶鍚屼互鍐呭瓨絀洪棿錛屼絾闇瑕佷緷闈犳煇縐嶅悓姝ユ満鍒?/p>
絎竴姝ワ細鍒涘緩鍏變韓鍐呭瓨
絎簩姝ワ細鏄犲皠鍏變韓鍐呭瓨
7銆佸鎺ュ瓧
涓嶅悓鏈哄櫒涔嬮棿閫氫俊