锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 榪欎釜鏄疢uxd涓鐩寸敤鐨勪笢瑗?br />鐩稿綋浜庝竴涓弻鍚慞IPE 緇堢琛岃紼?terminal line discipline 緇堢璁懼灞炴?->termios struct termios { local flag褰卞搷椹卞姩紼嬪簭鍜岀敤鎴蜂箣闂寸殑鎺ュ彛 cc_t control flag涓緢澶氶夐」鏍囧織閮芥槸鐢ㄥ嚑浣嶆爣璇嗙劧鍚庣敤鎴栨潵鍋氶夋嫨 isatty鐨勫疄鐜幫紝鍊熷姪tcgetattr鐨勫嚭閿欐満鍒訛紝鎴愬姛榪斿洖0錛涘惁鍒欒繑鍥?1錛屽甫涓奅NOTTY int return tcgetattr (fd, &term) == 0; Anyway錛岀粓绔疘O寰堝鏉?.. 鍒涘緩涓や釜PIPE錛屼竴涓敤浜庤緭鍏ョ粰鍗忓悓榪涚▼錛屽彟澶栦竴涓敤浜庢帴鏀跺崗鍚岃繘紼嬬殑杈撳嚭 鑰屽崗鍚岃繘紼嬬殑鍐欐硶鍙互姣旇緝common錛屽彧鐢ㄥ叧蹇?jī)鏍囧噯杈撳叆杈撳嚭銆?br />PIPE鍦ㄥ啓鐨勬椂鍊欏鏋滄湁澶氫釜鍐欒繘紼嬶紝閭d箞鍐欑殑鏁版嵁灝忎簬 PIPE_BUF 鍒欎笉浼?xì)湄曞簭锛屽惁鍒欒嚜宸卞簲璇闇瑕佸仛鍚屾浜?jiǎn)銆?/p>
鐒跺悗灝辨槸FIFO錛岃繖涓氨鏄敤mkfifo鍒涘緩涓涓猣ile錛屽ぇ瀹墮兘鍘葷敤銆?br />PIPE鍜孎IFO閮芥槸鍗婂弻宸ョ殑 XSI IPC ->鍗充箣鍓峉ystem V IPC 鍦ㄦ棤鍏寵繘紼嬩箣闂村叡浜瓨鍌ㄦ錛屼竴涓槸浣跨敤涓婇潰V緋葷粺shm錛涘彟澶栦竴涓槸浣跨敤mmap灝嗗悓涓鏂囦歡map鍒頒粬浠嚜宸辯殑榪涚▼絀洪棿銆?br />
Process A open ptm寰楀埌fdm錛岀劧鍚巉ork鍑簆rocess B錛宲rocess B open pts寰楀埌fds錛岀劧鍚庡皢0,1,2閮絛up鍒癴ds涓?br />閭d箞fds灝卞彉鎴愪簡(jiǎn)process B鐨勬帶鍒剁粓绔?br />鍚庨潰鍐峱rocess B涓仛鏍囧噯IO鎿嶄綔鐨勬椂鍊欏氨浼?xì)鍍廝IPE鐩存帴褰卞搷鍒癴dm
緇堢琛岃紼嬪湪pts涔嬩笂
娌′粈涔堢壒鍒璁板綍鐨勶紝鍦ㄧ綉涓妔earch浜?jiǎn)涓嬪Q岃創(chuàng)涓摼鎺ワ紝閲岄潰浼?xì)浠嬀l嶄竴浜涘熀鏈蹇?
http://www.cnblogs.com/Anker/archive/2012/12/25/2832568.html
]]>
姣忎釜緇堢閮芥湁杈撳叆杈撳嚭闃熷垪
闃熷垪閮芥湁闀垮害錛屽鏋滆緭鍏ヨ秴榪囪緭鍏ラ槦鍒桵AX_INPUT闀垮害錛屽ぇ澶氭暟unix緋葷粺浼?xì)鍥炴槕謸嶉搩鏉ュ鐞嗐?br />浣嗘槸瀵逛簬杈撳嚭闃熷垪鏉ヨ錛岃櫧鐒惰緭鍑洪槦鍒椾篃鏈夐暱搴︼紝浣嗘槸涓鏃﹀啓涓嶈繘鍘葷殑鏃跺欙紝鍐欒繘紼嬩細(xì)suspend鎺?br />鐩磋嚦鏈夌┖闂茬┖闂?/p>
浼?xì)甯繖鍋氳鑼冨鐞?/p>
tcflag_t c_iflag;
tcflag_t c_oflag;
tcflag_t c_cflag;
tcflag_t c_lflag;
cc_t c_line;
cc_t c_cc[NCCS];
};
Android涓妕cflag_t->
typedef unsigned int tcflag_t;
typedef unsigned char cc_t;
isatty (int fd)
{
struct termios term;
}
]]>
棣栧厛璁插埌鐨勬槸PIPE錛岃繖涓茍涓嶉檶鐢燂紝鐩鎬簰閫氫俊鐨凱rocess蹇呴』鍏鋒湁鍏崇郴錛屼竴鑸槸鍚岀埗浜茬殑
鐒跺悗璁插埌浜?jiǎn)鍗忓悓杩浗E?br />鍩烘湰鏄鏈変竴涓繘紼嬩笓闂ㄧ敤鏉ユ帴鏀惰緭鍏ワ紝鐒跺悗澶勭悊錛岀劧鍚庤繑鍥炵粨鏋?br />榪欎釜灝卞彲浠ョ敤PIPE鏉ュ疄鐜?/p>
fork涔嬪悗鍦ㄥ瓙榪涚▼涓皢鏍囧噯杈撳叆杈撳嚭閮絛up鍒扮閬撲笂
娑堟伅闃熷垪 淇″彿閲?鍏變韓瀛樺偍鍣?/p>
鍙﹀灝辨槸緗戠粶IPC浜?br />綆楁槸澶嶄範(fàn)涓嬪惂錛屼箣鍓嶈繖鍧楀効鐪嬬殑姣旇緝澶?br />int socket(int domain, int type, int protocol)
domain鏍囪瘑address family -> AF_INET, AF_INET6, AF_UNIX(AF_LOCAL), AF_UNSPEC
type鏍囪瘑socket綾誨瀷 -> SOCK_DGRAM(UDP), SOCK_RAW(IP), SOCK_SEQPACKET, SOCK_STREAM(TCP)
涓鑸琾rotocol閮借緗負(fù)0錛屼竴鑸琣ddress family鍜宼ype灝辮兘紜瑕佷嬌鐢ㄧ殑protocol
SOCK_SEQPACKET鍜孲OCK錛塖TREAM寰堝儚錛屽墠涓涓彁渚涢潰鍚戞暟鎹姤鏂囩殑鏈嶅姟錛岃屽悗闈㈣繖縐嶅垯鏄潰瀵規(guī)祦銆?br />SOCK_SEQPACKET浣跨敤鍦烘櫙SCTP錛岃創(chuàng)涓涓猄CTP鐨勭畝瑕佷粙緇嶃?br />http://www.cnblogs.com/qlee/archive/2011/07/13/2105717.html
娑夊強(qiáng)緗戠粶灝卞繀欏昏娓呮瀛楄妭搴忕殑闂錛屽瓧鑺傚簭涓庡瓧絎︾紪鐮佹槸涓や歡涓嶅悓鐨勪簨鎯咃紝閮借鎯蟲(chóng)竻妤氱殑錛屼絾鏄鎻愪竴涓婾TF-8榪欐槸涓縐嶄笓闂ㄨ璁$敤鏉ュ仛緗戠粶浼犺緭鐨勫瓧絎︾紪鐮?br />鏃犻渶鍏沖績(jī)瀛楄妭搴忕殑闂錛屾墍浠ヤ紶杈撶殑涓婂眰鏁版嵁鍙互鐢║TF-8錛屽氨涓嶇敤鎷呭績(jī)local host鍜宺emote host鐨勪富鏈哄瓧鑺傚簭涓嶄竴鏍瘋(gè)屽鑷翠貢搴忎簡(jiǎn)銆?br />
浣嗘槸寰堝鍗忚澶村繀欏誨仛絎﹀悎TCP/IP鍗忚鐨勫瓧鑺傚簭瑙勮寖錛孴CP/IP鏄痓ig endian
鍏充簬Big endian鍜孡itter endian鎴戞瘮杈冨鏄撳繕璁板叿浣撶殑鏍峰瓙錛屼絾鏄粬鐨勫嚭鍙戠偣鏄綆鍦板潃錛屼綆鍦板潃瑁呯殑鏄渶楂樻湁鏁堝瓧鑺傞偅涔堝氨鏄痓ig endian錛屽惁鍒欏氨鏄痩itter endian銆?br />
鍏充簬socket鏈夊嚑涓彲鑳芥瘮杈冩ā緋婄殑鍦版柟
connect鏃訛紝涔熷氨鏄痗lient绔紝濡傛灉fd娌℃湁緇戝畾鍒版煇涓湴鍧錛岄偅涔坘ernel浼?xì)甯繖灏嗗叾缁戝畾鍒伴粯璁ゅ湴鍧; 鎵浠ind榪欎歡浜嬫儏鏄疌lient鍜孲erver閮介渶瑕佸仛鐨勪簨鎯咃紝璋冪敤listen涔嬪墠涔熶竴鏍?br />鐒跺悗accept鐨勬椂鍊欙紝濡傛灉浣犲叧蹇?jī)瀵规柟鐨勫湴鍧錛岄偅涔堟彁渚沘ddr(瓚沖)鍜宭en錛岃繑鍥炵殑鏃跺欏氨鑳界煡閬撱?br />鍙﹀UDP(SOCK_DGRAM)涔熷彲浠all connect錛屼箣鍚庡氨鍙互鐩存帴call send/write錛岃屼笉蹇呮瘡嬈¢兘call sendto鎸囧畾瀵圭鍦板潃銆?br />
sendto涓璮lag涓鑸粰0錛屽鏋滄槸绱фユ暟鎹粰MSG_OOB
鏂囦歡鎻忚堪絎︾殑浼犺緭錛岀洰鐨勬槸鎯寵涓嶅悓鐨刾rocess鍦ㄤ笉鍚岀殑鏂囦歡鎻忚堪絎︿腑鍏變韓鏂囦歡琛ㄣ?br />鎵浠ュ仛娉曚笂緋葷粺浼?xì)杩欐狓P紝浼犺緭鏂囦歡琛ㄦ寚閽堢劧鍚庢斁鍒版帴鏀剁鐨勭涓涓彲鐢ㄧ殑鏂囦歡鎻忚堪絎︿笂銆?br />榪欎釜鎴戝湪linux涓婃病鎵懼埌瀹炵幇錛屽洜涓鴻繖涓姛鑳借繕鏄湁铔鏇夸唬鏂規(guī)鐨勩?br />
]]>
浣庨熺郴緇熻皟鐢紝涔熷氨鏄湁淇″彿鍙戠敓浼?xì)杩斿?errno 涓?EINTR鐨?/p>
紓佺洏鏂囦歡IO铏界劧鏈夊歡鏃訛紝浣嗘槸榪欎釜涓嶈兘綆楁槸浣庨熺郴緇熻皟鐢?/p>
APUE浠嬬粛鐨勪綆閫熺郴緇熻皟鐢?br />PIPE錛岀粓绔澶囷紝緗戠粶璁懼 璇誨啓
璇繪棤鏁版嵁/鍐欐棤絀洪棿(渚嬪TCP鍗ongestion window)
鎵撳紑鏌愪簺鐗規(guī)畩鏂囦歡
鍔犺褰曢攣鐨勬枃浠惰鍐?br />ioctl錛孖PC
鏂囦歡閿佸張鍙仛 byte-range locking錛岄拡瀵圭壒瀹氱殑鏂囦歡鍖哄煙錛岄傚悎鏁版嵁搴撴枃浠?br />Posix鏍囧噯
int fcntl(int fd, int cmd, .../* struct flock* flockptr */)
cmd -> F_GETLK,F_SETLK,F_SETLKW
F_SETLKW鏄疐_SETLK鐨凚locking鐗堟湰 W means wait
閲嶈鏁版嵁緇撴瀯鏄痵truct flock ->
struct flock {
short l_type;
short l_whence;
off_t l_start;
off_t l_len;
pid_t l_pid;
__ARCH_FLOCK_PAD
};
閿佸畾鏁翠釜file鐨勬柟寮? l_whence = SEEK_SET, l_start = 0, l_len = 0
l_type鐨勪袱綾籰ock
F_RDLCK錛孎_WRLCK榪欎袱縐嶉攣鐨勭壒鎬у緢鍍弐w lock
涓嶈繃涓庤鍐欓攣涓嶄竴鏍風(fēng)殑鏄垨鑰呰繖鏍瘋
Posix.1娌℃湁瑙勫畾涓嬮潰榪欑鎯呭喌: process A鍦ㄦ煇鏂囦歡鍖洪棿涓婅緗簡(jiǎn)涓鎶婅閿侊紱process B灝濊瘯鍦ㄨ繖涓枃浠跺尯闂村姞涓婂啓閿佺殑鏃跺檚uspend錛沺rocess C鍐嶅皾璇曡幏鍙栬閿侊紝濡傛灉鍏佽
process C鎷垮埌璇婚攣錛岄偅涔坧rocess B灝嗕細(xì)鍙兘姘歌繙鎷夸笉鍒板啓閿侊紝媧繪椿楗挎
pthread閲岄潰鐨剅w lock鐨勫疄鐜頒細(xì)鍦ㄨ繖縐嶆儏鍐典笅suspend鎺塸rocess C鐨勮閿佽姹傦紱浣嗘槸鐩墠鏂囦歡鍖哄煙閿佺殑瀹炵幇鎴戜笉澶‘瀹?/p>
榪欓噷鐪嬫枃浠跺尯鍩熼攣榪樻槸姣旇緝瀹規(guī)槗甯︽潵deadlock鐨?br />渚嬪process A閿佷綇F1鐨勬煇涓尯鍩燂紝鐒跺悗鍘婚攣F2鐨勪竴涓尯鍩燂紝榪欐椂鍊橣2鐨勮繖涓尯鍩熻process B閿佷綇錛岄偅涔坧rocess A灝變細(xì)suspend錛屽鏋滆繖涓椂鍊檖rocess B榪囨潵瑕侀攣F1鐨勮繖涓尯鍩?br />灝變細(xì)鍙戠敓deadlock
鍏充簬鏂囦歡鍖哄煙閿佺殑緇ф壙鍜岄噴鏀?br />1.fork鍚庯紝鏂囦歡鍖哄煙閿佸茍涓嶇戶鎵匡紝緇ф壙浜?jiǎn)灏卞畬浜?jiǎn)錛屼笉鍚岀殑process灝辨湁鍙兘鍚屾椂騫插悓涓浠朵簨鎯咃紝鎶婃暟鎹悶鍧?br />2.close(fd)鍚?fd瀵瑰簲鐨勬枃浠墮攣灝辮閲婃斁浜?jiǎn)锛屾枃錃g閿佹寕鍦╥node涓婏紝close鐨勬椂鍊檏ernel浼?xì)鍘绘壂鎻忓搴旂殑inode涓婁笌榪欎釜PID鐩稿叧鐨刲ock錛岄噴鏀炬帀錛岃屽茍涓嶅幓鍏沖績(jī)鏄摢涓枃浠舵弿榪扮鎴?/p>
鑰呮槸鍝釜鏂囦歡琛紝榪欏緢閲嶈錛屽洜涓簂ockf涓茍涓嶈褰昮d錛屼粬浠彧鏄急鍏寵仈鍏崇郴錛岃繖涓緢閲嶈銆?br />3.exec鍚庯紝鏂囦歡閿佷細(xì)緇ф壙鍘熸潵鎵ц紼嬪簭鐨勯攣(fork涔嬪悗鎷垮埌鐨刲ock)錛屽鏋渇d甯︽湁close-on-exec閭d箞鏍規(guī)嵁絎簩鏉★紝榪欎釜fd瀵瑰簲鐨刦ile涓婄殑閿侀兘浼?xì)琚噴鏀俱?/p>
鍚庨潰璁蹭簡(jiǎn)STREAMS錛屾劅瑙塴inux涓婄敤鍒扮殑涓嶅錛岄渶瑕佸湪緙栬瘧kernel鏃跺姩鎬佸姞杞?/p>
IO澶氳礬杞帴錛屼富瑕佹槸涓轟簡(jiǎn)瀹炵幇polling鏃㈡墍璋撶殑杞
涓昏鍑芥暟鏈塻elect錛宲select錛宲oll錛宔poll
select涔熶細(xì)綆楁槸浣庨熺郴緇熻皟鐢紝閭d箞灝辨湁鍙兘琚俊鍙鋒墦鏂?br />pselect鏈夊弬鏁板彲浠ヨ瀹氫俊鍙峰睆钄介泦錛屼篃鎻愪緵鏇撮珮綺懼害鐨則imer
poll鐨勬柟寮忎笌select鏈変笉澶竴鏍風(fēng)殑鍦版柟錛屼絾鏄姛鑳界浉鍚岋紝epoll鏇撮傚悎澶ф暟鎹噺銆?/p>
readv鍜寃ritev
璁頒綇涓嬮潰涓ゆ潯灝卞浜?br />涓涓О涓簊catter read(鏁f璇?錛涘彟澶栦竴涓О涓篻ather write(鑱氶泦鍐?
榪欎袱涓嚱鏁頒細(xì)闈㈠涓涓猙uffer閾捐〃銆?br />
readn鍜寃riten
榪欎釜姣旇緝鍍忕幇鍦ˋndroid閲岄潰socket鐨剅ead鍜寃rite鏂瑰紡錛屼繚璇佽兘read/write n byte鏁版嵁錛屽湪鍐呴儴鍋氬驚鐜?br />鎴戞瘮杈冨ソ濂囪繖涓や釜鏄惁浼?xì)澶勭悊signal錛屾兂鏉ュ簲璇ユ槸浼?xì)澶勭悊鐨勫Q岄亣鍒癊INTR甯繖閲嶅惎灝卞ソ浜?/p>
鎴戞病鏈夋壘鍒癇ionic搴撶殑瀹炵幇
瀛樺偍鏄犲皠IO
榪欎釜寰堥噸瑕侊紝mmap鐢ㄧ殑寰堝錛屾槧灝勫埌process絀洪棿鐨勪綅緗湪 stack浠ヤ笅錛宧eap浠ヤ笂鐨勯儴鍒嗭紝map瀹屽悗榪斿洖浣庡湴鍧銆?/p>
#include<sys/mman.h>
void* mmap(void* addr, size_t len, int prot, int flag, int filedes, off_t off)
prot -> PROT_READ,PROT_WRITE,PROT_EXEC,PROT_NONE
prot鎸囧畾鐨勫鏄犲皠瀛樺偍鍖虹殑淇濇姢涓嶈兘瓚呰繃鏂囦歡鐨刼pen鏉冮檺
鍦?flag涓?MAP_FIXED鐨勬椂鍊橭S浼?xì)淇濊瘉鍒嗛厤鐨刴emory璧峰鍦板潃涓篴ddr錛屽惁鍒欏彧鏄粰OS涓涓緩璁?br />涓鑸緩璁產(chǎn)ddr緇?錛岃OS鏉ュ喅瀹氥?/p>
MAP_SHARED鏄瀵規(guī)槧灝勫尯鍩熺殑瀛樺偍(write)浼?xì)瀵艰嚧淇敼璇ユ枃錃g銆?br />MAP_PRIVATE鍒欐槸瀵規(guī)槧灝勫尯鍩熺殑鎿嶄綔浼?xì)甯歌涓涓槧灝勬枃浠剁殑鍓湰銆?br />
鍚庨潰鏈変釜渚嬪瓙鐢ㄤ簡(jiǎn)lseek
浣跨敤lseek澧炲姞鏂囦歡闀垮害鐨勬柟寮忥紝鍏坙seek涓涓鹼紝濡傛灉榪欎釜鍊煎ぇ浜庢枃浠舵湰韜殑闀垮害錛岄偅涔堜笅涓嬈″啓灝變細(xì)鍔犻暱璇ユ枃浠訛紝騫朵笖鍦ㄦ枃浠?br />涓艦鎴愪竴涓┖媧烇紝鏈啓榪囩殑鍐呭鍏ㄩ儴璇諱負(fù)0銆?br />mmap鍙兘map鏂囦歡鐨勬渶澶ч暱搴︼紝瓚呰繃鐨勫湴鏂規(guī)病鍔炴硶鍚屾鍒版枃浠躲?/p>
APUE璁茬殑destroy浼?xì)free絀洪棿錛岃繖浠朵簨鎯呯湅璧鋒潵涓嶅お瀵癸紝涔熻鏄疊ase on瀹炵幇
璧風(fēng)爜鎴戠湅鍒扮殑瀹炵幇鏄病鏈夊仛榪欎歡浜嬫儏鐨勩?/p>
Attribution鏈変笅闈㈣繖浜涖?br />
鎴戜滑鍙互鐢╩alloc鍜宮map緇橳hread鍒嗛厤stack錛屾寚瀹歴tack澶у皬鍜屼綅緗?浣庡湴鍧)
mutex灞炴?br />涓や釜涓滆タ
1.榪涚▼鍏變韓灞炴э紝PTHREAD_PROCESS_PRIVATE or SHARED
鎰忔濇槸璇村鏋滆繖涓狹utex鏄垎閰嶅湪涓や釜榪涚▼鍏變韓鐨刴emory錛岀劧鍚庤緗負(fù)shared mutex灝卞彲浠ョ敤浜庤繘紼嬪悓姝?br />2.綾誨瀷灞炴э紝normal;errorcheck;recurive
鎰忔濇槸瀹氫箟Mutex鏈韓鐨勭壒鎬э紝榪欓噷鏇存涓嬪墠闈㈤偅绔犳彁鍒扮殑閿欒
鍙湁normal鐨刴utex鎵嶄細(xì)鍦ㄥ啀嬈″姞閿佹椂鍙戠敓deadlock
errorcheck鐨勪細(xì)鐩存帴榪斿洖閿欒
recurive鏈韓灝卞厑璁革紝浼?xì)鏈夎鏁?/p>
rw lock鍜宑ondition灞炴?br />鍙敮鎸佺涓涓?br />
TLS鍙橀噺
鍏堢湅涓婽LS鐨勪綅緗?/p>
pthread_internal_t鏄褰曠嚎紼嬭嚜宸辨湰韜殑涓浜涘睘鎬х殑鍙橀噺錛実uard page灝辨槸綰跨▼attr涓婅緗殑闃叉鏍堟孩鍑虹殑鎵╁睍鍐呭瓨
鍒涘緩TLS鍙橀噺鐨勬柟娉?br />1.鍒涘緩Key錛岃繖涓狵ey鏄繖涓狿rocess涓墍鏈塗hread鍙互鍏變韓璁塊棶鐨勶紝鐒跺悗姣忎釜Thread鑷繁鍘誨叧鑱旇嚜宸辯殑Thread Local鍙橀噺
int pthread_key_create(pthread_key_t *keyp, void (*destructor)(void*))
鍒涘緩key鐨勬椂鍊欓渶瑕佷繚璇佸敮涓璋冪敤錛屼篃灝辨槸涓嶄細(xì)鏈変袱涓猅hread鍚屾椂璋冪敤錛岀劧鍚庡彂鐢熶竴浜沚ase on瀹炵幇鐨勪笉紜畾鐨勭粨鏋滐紝鍙互浣跨敤pthread_once
pthread_once鐨勫疄鐜板緢綆鍗曪紝鐢╩utex鍋氫簰鏂ラ噺淇濊瘉pthread_once_t鐨勮闂紝鐒跺悗鍒╃敤pthread_once_t鍋歠lag鏉ヨ皟鐢╥nit_routine
鎵浠ヨ繖涓猵thread_once_t蹇呴』鏄叏灞or闈?rùn)鎬佸彉閲?br />pthread_once鏈甯哥敤鐨刢ase闄や簡(jiǎn)鎷垮埌TLS key澶栵紝init鍑芥暟緇忓父浼?xì)鋴社敤杩欎釜锛岄伩鍏嶅绾拷E嬪悓鏃惰皟鐢ㄣ?br />
鐒跺悗灝辨槸thread cancel
Android Bionic搴撴病鏈夊疄鐜?pthread_setcancelstate(int state, int* oldstate)浠ュ強(qiáng)pthread_cancel()
榪欓噷thread鐨勫彇娑堬紝鏈変簺鏄彇娑堜笉鎺夌殑錛屼緥濡備竴浜沚locking call錛屾墍鏈夌殑鍙栨秷鍧囨槸闇瑕佽瀹氫竴浜涘彇娑堢偣鐨勶紝
鏈変漢鏈変笓闂ㄩ拡瀵笰ndroid娌℃湁Thread Cancel鏉ユ兂鍔炴硶
鍩烘湰灝辨槸thread signal錛屽湪signal handler涓幓call pthread_exit();
or鐢≒IPE鍦ㄥ璺鐢ㄤ腑break鍑烘潵
http://blog.csdn.net/langresser/article/details/8531112
濡傛灉淇″彿涓庣‖浠舵晠闅渙r璁℃椂鍣ㄨ秴鏃剁浉鍏籌紝閭d箞淇″彿浼?xì)鍙戦佸埌寮曡搗浜嬩歡鐨勮綰跨▼涓幓錛屽叾浠栦俊鍙蜂細(xì)鍙戦佸埌浠繪剰涓涓嚎紼嬨?br />榪欓噷鏄鐨凱OSIX綰跨▼妯″瀷錛屼竴鑸殑淇″彿閮戒細(xì)鍙戦佺粰榪涚▼涓病鏈夐樆濉炶淇″彿鐨勬煇涓嚎紼嬨侫PUE璁茬殑鏌愪釜娌℃湁闃誨璇ヤ俊鍙風(fēng)殑綰跨▼錛屽叾瀹炴湁鐐規(guī)ā緋娿?br />
浣嗘槸Linux鐨勫疄鐜頒笉涓鏍鳳紝linux鐨則hread鏄痗lone鍑烘潵鐨勶紝灝辨槸鍏變韓璧勬簮鐨勭嫭绔嬭繘紼嬶紝榪欐牱瀛愬叾瀹炶洰鑷劧鐨勶紝涔熶笉瀹規(guī)槗澶嶆潅銆?br />linux涓紝鏈夊彲鑳界嚎紼嬪氨涓嶄細(xì)娉ㄦ剰鍒拌淇″彿錛岃繖鏍瘋涔熸湁鐐規(guī)ā緋婏紝鎬諱箣緇堢椹卞姩紼嬪簭鐨勪俊鍙蜂細(xì)灝嗕俊鍙烽氱煡鍒拌繘紼嬬粍錛岃繖鏍峰瓙鎵鏈夌殑thread灝變細(xì)閮芥敹鍒頒俊鍙?br />濡傛灉浣犱笉鎯蟲(chóng)墍鏈夌殑綰跨▼閮藉幓鍏沖績(jī)淇″彿錛岄偅涔堝彲浠ヤ嬌鐢ㄤ竴涓笓闂ㄥ鐞嗕俊鍙風(fēng)殑綰跨▼
鍏堝皢鍏朵粬綰跨▼鐨剆ignal閮絧thread_sigmask SIG_BLOCK鎺夛紝鐒跺悗浣跨敤sigwait鍦ㄧ壒瀹氱殑綰跨▼鏉ョ瓑
pthread_sigmask鍜宻igprocmask寰堝儚
thread涓巉ork
fork鍚庣殑瀛愯繘紼嬩細(xì)緇ф壙mutex, rw lock, condition鐨勭姸鎬?br />浣嗘槸瀛愯繘紼嬩腑鍙細(xì)瀛樺湪涓涓嚎紼嬶紝涔熷氨鏄偅涓皟鐢╢ork鐨勭嚎紼嬬殑鍓湰錛屾湁涓鏉傜殑浜嬫儏鏄叧浜庝笂闈㈢戶鎵夸笅鏉ョ殑閭d簺涓滆タ錛屽瓙榪涚▼鐢變簬鍙湁涓涓嚎紼嬶紝娌″姙娉曠煡閬?br />涓婇潰閭d笁涓笢瑗跨殑鍏蜂綋鐘舵侊紝闇瑕佹湁涓竻鐞嗛攣鐨勫姩浣?-->pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void))
鎴戠洰鍓嶄笉鐭ラ亾榪欎釜涓滆タ鐨勪嬌鐢ㄥ満鏅紝鑰屼笖涓嶅鏄撴帶鍒躲?br />鍥犱負(fù)涓鑸鏋滄垜浠琭ork鍚庨兘浼?xì)鎺xecu錛岃繖鏍峰湴鍧絀洪棿灝變細(xì)鏀瑰彉錛岄偅涔堣繖浜涚戶鎵跨殑涓滆タ灝辨病鐢ㄤ簡(jiǎn)銆?br />
鐒跺悗鏈夎皥涓鐐瑰叧浜庣嚎紼婭O鐨勪笢瑗?br />pwrite/pread
涔熷氨鏄師瀛愮殑榪涜lseek鍜宺/w錛屼絾鏄繖涓茍涓嶈兘淇濊瘉澶у甯歌鐨勫啿紿侀棶棰橈紝涔熷氨鏄竴涓猼hread鍦ㄥ啓鍙﹀涓涓璇伙紝鎵浠ヨ繖涓や釜涓滆タ騫朵笉鑳借В鍐沖悓姝ョ殑闂銆?br />
浣滀笟:
12.3 鐞嗚涓婂嚱鏁板紑濮嬫椂灞忚斀鎵鏈変俊鍙鳳紝鍑芥暟緇撴潫鏃舵仮澶嶏紝鏄彲浠ュ仛鍒板紓姝ヤ俊鍙峰畨鍏ㄧ殑銆傚鏋滀綘鍙槸灞忚斀涓浜涗俊鍙鳳紝閭d箞娌″姙娉曞仛鍒幫紝鍥犱負(fù)濡傛灉鏈夊叾浠栦俊鍙瘋繘鏉ワ紝浣燾all鐨勫嚱鏁伴噷闈㈡湁涓浜涗笉鍙噸鍏ョ殑鍑芥暟錛屽悓鏍蜂笉鑳戒繚璇佹槸寮傛瀹夊叏鐨勩?br />
12.5 fork鍙互鍦ㄦ嬁鏉ユ墽琛屽彲鎵ц紼嬪簭錛岀幇鍦ㄥ簲璇ュ氨榪欎竴涓狢ase銆?/p>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr
void* (*start_rtn)(void), void* restrict arg)
thread琚垱寤虹殑鏃跺欎細(xì)緇ф壙璋冪敤綰跨▼鐨勬誕鐐圭幆澧冨拰淇″彿灞忚斀瀛楋紝浣嗘槸璇ョ嚎紼嬬殑鏈喅淇″彿闆嗗皢浼?xì)琚竻妤氬Q?br />娓呴櫎鏈喅淇″彿闆嗚繖浠朵簨鎯呭簲璇ユ槸娌℃湁鐤戦棶鐨勶紝鍦╰hread鍒涘緩涔嬪墠pending浣忕殑淇″彿錛屼笉搴旇deliver緇欎笅涓涓?br />Ps: 綰跨▼鐨勬誕鐐圭幆澧冩寚鐨勬槸鍟? 鐪嬫潵浠ュ悗鎴戝簲璇ュ幓娉ㄦ剰涓嬫誕鐐規(guī)暟鐨勮繍綆楀師鐞嗐?/p>
pthread鐩稿叧鐨勫嚱鏁頒細(xì)鐩存帴榪斿洖閿欒鐮侊紝鑰屼笉浼?xì)鍜屼竴浜泂ystem call涓鏍鳳紝緗叏灞errno錛屼袱縐嶆柟寮忛兘鏈夊ソ澶勶紝涓涓彲浠ヨ榪斿洖鍊?br />甯﹀洖鐨勯敊璇唬鐮侀泦涓搗鏉ワ紝鑼冨洿緙╁皬錛涘彟澶栦竴涓潪甯告柟渚匡紝鍏抽敭鐐瑰湪浜庤繖涓綾誨叡鐢╡rrno鐨勬槸鍚︾湡鐨勫紓甯告槸鍙互鍏辯敤鐨勩?/p>
pthread_create榪斿洖涔嬪墠鏈夊彲鑳芥柊鐨勭嚎紼嬪氨宸茬粡寮濮媟un浜?/p>
鍚姩鍑芥暟 void* (*start_rtn)(void)
鍙互閫氳繃return緇欏洖鏉ワ紝涔熷彲浠ラ氳繃pthread_exit緇?br />榪欎釜浼?xì)瀛樺湪涓涓湴鏂?br />閫氳繃pthread_join(tid, void**)鍙栧洖鏉?/p>
榪欓噷join鐨勫拰java join鏄竴鏍風(fēng)殑鍔熻兘
濡傛灉榪欎釜涓滆タ鏄竴涓緢澶х殑涓滆タ:)錛岄偅涔堟斁鍒癶eap鏄渶濂界殑閫夋嫨錛屼笉瑕佹斁鍒皊tack涓婁簡(jiǎn)錛屼笉鐒剁嚎紼嬭繑鍥炶繖涓滆タ灝辨病浜?jiǎn)锛宩oin鍙栧埌鐨勫唴瀛樺湴鍧灝卞彉鎴愪竴涓棤鏁堢殑浜?jiǎn)锛孲IGSEGV灝變細(xì)琚彂鍑烘潵
pthread_cancel錛屽悓涓涓繘紼嬪彲浠all錛屾彁鍑?guó)櫙锋眰缁堟绾拷E?/p>
pthread_cleanup_push
pthread_cleanup_pop
綰跨▼鍒嗙錛岃繖鏍峰瓙綰跨▼緇堟鍚庡彲浠ラ噴鏀句竴浜涜祫婧愶紝鑰屼笉鐢ㄤ竴瀹氳鍏朵粬浜烘潵join
鏂規(guī)硶鏈変袱縐嶏紝鏂板緩鐨勬椂鍊欏姞涓婂垎紱誨睘鎬?br /> pthread_attr_init (&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
鎴栬卌all pthread_detach(pthread_t tid)
綰跨▼浜掓枼涓庡悓姝?/p>
澶氭敞鎰弙olatile鍙橀噺錛岃繖涓笢瑗跨悊璁轟笂灝辨槸璁╃紪璇戝櫒涓嶈鍋氫紭鍖栵紝涓嶈cache volatile綾誨瀷鐨勫彉閲忥紝
姣忔閮藉幓鍐呭瓨鍦板潃涓嬁錛岃屼笉鏄瘎瀛樺櫒/楂橀熺紦瀛樺壇鏈紝榪欑鍙橀噺鏋佸鏄撹緙栬瘧鍣ㄤ笉鐭ラ亾鐨勪漢鏀瑰彉錛屼緥濡傚叾浠栫嚎紼嬨?/p>
闈?rùn)鎬佸垵濮嬪寲:
#define PTHREAD_MUTEX_INITIALIZER {0}
#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER {0x4000}
#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER {0x8000}
鎵璋撶殑鍔ㄦ佸垵濮嬪寲
pthread_mutex_init; pthread_mutex_destroy
鐒跺悗灝辨槸涓浜沺thread mutex鐨勫熀鏈鐞嗗嚱鏁頒簡(jiǎn)
lock,unlock
trylock;
榪欎釜trylock闇瑕佸ソ濂界悊瑙d笅錛屽皾璇曡幏鍙杔ock錛屽鏋淥K錛岄偅涔坙ock浠栫劧鍚?return 0; 鍚﹀垯涔熶笉浼?xì)suspend浣忥紝鑰屾槸鐩存帴榪斿洖EBUSY
pthread_mutex_destroy, 浼?xì)鍏堝幓try lock錛岀劧鍚庡鐞嗘帀榪欎釜mutex鐨勫箋?/p>
榪欓噷紼嶅井鎻愪竴涓?/p>
__likely/__unlikely鍑芥暟鐢ㄦ潵鍛婅瘔緙栬瘧鍣ㄤ紭鍖栦唬鐮侊紝綾諱技if else涓渶鏈夊彲鑳給r鏈娌℃湁鍙兘鍙戠敓鐨凜ase
mutex灝辨湁deadlock鐨勯棶棰橈紝鍗曠嚎紼嬶紝濡傛灉鏈変唬鐮侀噸鍏ラ噸澶嶈幏鍙栭攣灝變細(xì)deadlock錛屽洜涓轟綘璧頒笉鍒頒綘unlock鐨勫湴鏂瑰幓錛涘彟澶?br />甯歌鐨刣eadlock灝辨槸lock姣旇緝澶氾紝鍙堟病鏈夎璁″ソ欏哄簭錛岃繖涓簲璇ヤ粠涓氬姟閫昏緫涓婂氨搴旇瀹氫箟濂斤紝褰撶劧鏈夋椂鍊欐湁鐨勪漢鐢ㄧ殑鏃跺檕r鏀逛唬鐮佺殑鏃跺?br />騫舵病鏈夌悊娓呰繖浜沴ock鐨勫叧緋伙紝鏄惁鏈塪ependency錛屾瘮杈冮毦閫氳繃鍊熺敤涓浜涚紪璇戠郴緇熸潵Cover浣忥紝鐒跺悗鏀瑰畬灝辨湁bug銆?br />
鐒跺悗榪樻湁涓縐嶉渶瑕佽璁″ソ鐨勬槸閿佺殑綺掑害
澶矖澶粏閮戒笉濂?br />綺掑害澶矖錛宭ock浣忕殑涓滆タ澶錛屽緢澶氱嚎紼嬮兘瑕佺瓑lock錛屾渶鍚庤繖涓笢瑗夸細(xì)婕斿彉鎴愪竴涓覆琛岀殑涓滆タ
綺掑害澶粏錛宭ock鍙堝彉鐨勫お澶氾紝涓嶅仠鐨勯渶瑕乴ock/unlock錛宲erformance灝變細(xì)鍙樺樊銆?br />鐩墠鐪嬪埌鐨凙ndroid涓婄殑寰堝lock閮藉お綺椼?br />
rw閿?->璇誨啓閿?br />鍩烘湰鐞嗗康灝辨槸璇諱笉浼?xì)濯?jiǎng)鍝嶄復(fù)鐣屽尯鍙戠敓鍙樺寲
鎵浠ヨ妯″紡鐨剅w lock鍙互澶氫釜浜哄崰鐢紝鍐欐ā寮忕殑rw lock鏃惰兘琚竴涓嚎紼媗ock
鍙鏈夊啓妯″紡lock璇鋒眰錛岄偅涔堝悗闈㈢殑璇繪ā寮弆ock璇鋒眰涓鑸疄鐜版槸閮戒細(xì)琚玈uspend浣忥紝涓嶇劧鍥犱負(fù)璇繪ā寮忎笅錛屽彲浠ラ噸澶峫ock錛屽鏋滀笉
suspend錛岄偅涔堝啓妯″紡鐨刲ock璇鋒眰鏈夊彲鑳芥案榪滃緱涓嶅埌鐩稿簲銆?br />rw閿佷竴鑸敤鍦?read姣?write琛屼負(fù)澶氱殑澶氱殑鍦烘櫙錛屽厑璁稿綰跨▼騫跺彂鍘昏錛屽崟涓綰跨▼鍘誨啓銆?br />
鐒跺悗浼?xì)鎯冲埌spinlock錛屽彲浠ュ幓緗戜笂search鐪嬩笅鍩烘湰姒傚康錛宻pinlock涓鑸湪SMP鏋舵瀯涓嬩細(xì)姣旇緝鏈夋晥鏋溿?br />
mutex鏄竴縐嶅悓姝ユ満鍒秓r璁茶繖鏄竴縐嶄簰鏂ユ満鍒?-> Java synchronize
榪樹(shù)竴縐嶅氨鏄潯浠跺彉閲?condition.. -> wait/notify
榪欓噷鏈夋璇濆緢濂?br />鏉′歡鍙橀噺緇欏涓嚎紼嬫彁渚涗簡(jiǎn)涓涓洖鍚堢殑鍦烘墍錛屾潯浠跺彉閲忎笌浜掓枼閲忎竴璧蜂嬌鐢ㄧ殑鏃跺欙紝鍏佽綰跨▼浠ユ棤绔炰簤鏂瑰紡絳夊緟鐗瑰畾鐨勬潯浠跺彂鐢熴?br />
浣滀笟:
1.綰跨▼涔嬮棿浼犻掓暟鎹笉瑕佺敤stack鍙橀噺錛岀敤鏀懼埌涓嬮潰榪欎簺鍦版柟鐨勫彉閲忓氨濂斤紝RW/RO/ZI/Heap灝辨病浜嬩簡(jiǎn)
4.
鐜板湪涓鑸兘鏄繖鏍?/p>
pthread_mutex_lock(&s_startupMutex);
s_started = 1;
pthread_cond_broadcast(&s_startupCond);
pthread_mutex_unlock(&s_startupMutex);
浼?xì)鍦╞roadcast鍚庢墠unlock
鍚﹀垯鏈夋瘮杈冮珮鐨勬鐜囷紝unlock鍚庯紝琚叾浠栫嚎紼嬪皢鏉′歡鏀規(guī)帀錛岃繖涓椂鍊檅roadcast鍑哄幓灝辨病鏈夋剰涔変簡(jiǎn)銆?br />浣嗘槸榪欑涔熸湁鍙兘浼?xì)琚彟澶栦竴涓嚎紼嬶紝騫墮潪wait鍦ㄩ偅閲岀殑綰跨▼鏀瑰彉鏉′歡鍊?br />
鎵浠?pthread_cond_wait 榪斿洖騫朵笉鎰忓懗鐫鏉′歡涓瀹氫負(fù)鐪熶簡(jiǎn)
鏈濂芥槸always check鏉′歡
綾諱技榪欑
while (s_started == 0) {
pthread_cond_wait(&s_startupCond, &s_startupMutex);
}
榪欓噷涔熺◢寰В閲婁笅Kill榪欎釜涓滆タ錛宬ill鍑芥暟錛宬ill鍛戒護(hù)騫朵笉鏄瓧闈笂鏉鎺夋煇浜涗笢瑗匡紝kill鍙槸鍦ㄧ壒瀹氱殑鏃墮棿鍙戦佷俊鍙鳳紝
鍏蜂綋鐨勫鐞嗗彇鍐充簬淇″彿鏈韓鍜屼俊鍙風(fēng)殑澶勭悊鏂瑰紡銆?/p>
淇″彿鐨勫鐞嗘柟寮?
榪欎釜鏈夌偣綾諱技Java Exception鐨勫鐞嗘柟寮忥紝catch浣弌r寰涓妕hrow
APUE璁茬殑淇″彿澶勭悊鏂瑰紡鏈変笁縐?br />1.蹇界暐錛孲IGKILL/SIGSTOP涓嶈兘蹇界暐錛涗竴鑸鏋淧rocess鑷繁涓嶇鐨勮瘽錛屽簲璇ヤ細(xì)璧板埌緋葷粺榛樿鐨勫鐞嗘祦紼嬩腑錛屾墍浠ヤ笉鑳藉拷鐣ヨ繖浠朵簨鎯呮槸緋葷粺鑷繁灝變細(xì)淇濊瘉鐨勩?br />2.鎹曟崏淇″彿錛屼緥濡係IGCHLD,涓鑸琾arent浼?xì)call waitpid鍙栧瓙榪涚▼緇堟鐘舵侊紝閬垮厤浠栧鐞哯ombie鐘舵併?br />3.鎵ц緋葷粺榛樿鍔ㄤ綔
鎴戞劅瑙?鍜?鍙互褰掍負(fù)涓綾誨惂錛屽彧鏄湁浜泂ignal娌℃湁緋葷粺榛樿鍔ㄤ綔錛岀劧鍚庡氨璺寵繃鍘諱簡(jiǎn)銆備竴鑸殑緋葷粺榛樿鍔ㄤ綔涔熷氨鏄粓姝㈣繘紼嬨?/p>
SIGKILL/SIGSTOP涓嶈兘琚拷鐣ョ殑鍘熷洜鎴戣寰楄鐨勪笉閿欙紝鎻愪緵瓚呯駭鐢ㄦ埛緇堟榪涚▼鐨勫彲闈犳柟娉曪紝涓嶇劧鍚庣畫(huà)鏈夊彲鑳借繘紼嬬殑琛屼負(fù)鏄湭瀹氫箟鐨?
signal鍑芥暟瀹氫箟:(
void (*signal(int signo, void(*func)(int)))(int);
榪欎釜C鍑芥暟鐨勫0鏄庢湁鐐歸毦鐪嬫噦
APUE璁瞫ignal鐨勮涔変笌瀹炵幇鏈夊叧錛屾墍浠ュ緩璁ぇ瀹墮兘鐢╯igaction
涓嶈繃鎴戠湅浜?jiǎn)涓婣ndroid Bionic涓嬬殑瀹炵幇錛屽垎鍒寘鍚獴SD浠ュ強(qiáng)SYSV鐨勭増鏈紝浣嗕篃閮藉彉鎴愪簡(jiǎn)sigaction錛屾墍浠ヤ竴鑸湪C搴撲腑灝變繚璇佷簡(jiǎn)榪欎竴鐐癸紝涔熷氨鏃犳墍璋撲簡(jiǎn)銆?/p>
exec鍑芥暟浼?xì)璁蹭俊鍙峰鐞嗘柟寮彉q樺師涓虹郴緇熼粯璁わ紝榪欎釜搴旇姣棤鐤戦棶錛宔xec鍚庡湴鍧絀洪棿灝變笉涓鏍蜂簡(jiǎn)錛屼繚鐣欎箣鍓嶇殑鎹曟崏鍑芥暟涔熸槸鏃犳剰涔夌殑錛涘湪榪欎箣鍓嶆槸鏈夋剰涔夌殑錛屾垜鐨勬剰鎬濇槸璇磃ork鍚巈xec涔嬪墠銆?/p>
鍚庨潰鏈夊垪涓澶у爢鏄惁鍙互閲嶅叆鐨勫嚱鏁幫紝涓嶅お鎯寵錛岀劧鍚庤鍒頒簡(jiǎn)malloc
鎴戞兂涓嶈兘閲嶅叆鐨勫嚱鏁版棤澶栦箮涓ょ綾誨瀷
one: 鑷繁鏈塵aintain涓浜涘叏灞or static鍙橀噺 --> malloc 緇存姢鍒嗛厤鍐呭瓨鏃秙tatic heap linklist
two: 鍑芥暟鍙傛暟閲岄潰鏈夊紩鐢ㄤ箣綾葷殑錛屼細(xì)褰卞搷璋冪敤鑰呯殑鎯呭喌銆?/p>
鐒跺悗鎴戠湅鍒拌繖涓珛椹氨鎯沖埌浜?jiǎn)绾拷E嬪畨鍏紝malloc鏄嚎紼嬪畨鍏ㄧ殑楹?
鍘葷湅浜?jiǎn)涓婤ionic鐨勫疄鐜幫紝鐒跺悗灝卞張鐪嬪埌涓嬮潰榪欎釜鍚嶅瓧 Dong Lea錛岄┈涓婂氨浼?xì)鎯冲埌Java Concurrent搴擄紝鐪嬪埌榪欎釜浣犵洿鎺ュ氨浼?xì)鏈夋兿x(chóng)硶錛孊ionic閲岄潰榪欎釜malloc鑲畾鏄嚎紼嬪畨鍏ㄧ殑錛?br />鏈夋椂鍊欒榪欎簺涓滆タ鎼炵殑寰堢瘡錛屾瘮杈冪儲(chǔ)浠栵紝鑰屼笖Bionic閲岄潰鐢ㄧ殑malloc鐨勯偅涓疄鐜扮増鏈?aka dlmalloc)鎴戝張娌$湅鎳?(錛屽彧濂藉幓緗戜笂search浜?jiǎn)涓涓嬶紝鏈変釜浜哄仛榪囧疄楠岋紝鏈変簺緇撹榪樻槸鍙互鍙傝冪殑
http://www.360doc.com/content/12/0420/23/168576_205320609.shtml
鎬葷殑鏉ヨ錛岃繖涓笢瑗垮彇鍐充簬C搴撳疄鐜幫紝鎴戞兂Bionic鍜孏libc閮藉簲璇ヤ竴鏍蜂細(xì)鏀寔涓ょ涓嶅悓鐨勭増鏈紝鐒跺悗緙栬瘧鐨勬椂鍊欏氨鍙互紜畾鏄惁鏈夌嚎紼嬬浉鍏蟲(chóng)搷浣滐紝鐒跺悗鍦╨ink鐨勬椂鍊檒ink榪囨潵涓嶅悓鐨勭増鏈?/p>
綰跨▼瀹夊叏鍜屼俊鍙峰畨鍏ㄦ槸涓や釜姒傚康
濡傛灉鍦ㄧ嚎紼嬪畨鍏ㄧ殑malloc涓紝淇″彿澶勭悊鍑芥暟涓彂鐢熼噸鍏ワ紝閭d箞搴旇鏄細(xì)鍙戠敓dead lock
濡傛灉鏄潪綰跨▼瀹夊叏涓紝閭d箞搴旇鏄墍璋撶殑 undefined behavior.
鍓嶉潰榪樻湁涓涓鐜囧繕璁板啓
鏃╂湡鐨刄nix緋葷粺錛屽鏋滅郴緇熷湪鎵ц涓涓綆閫熺郴緇熻皟鐢?鍩烘湰鍙互鎬葷粨涓篵locking IO:鍖呮嫭IPC錛孎ile IO錛宨octl)錛岄偅涔堝鏋滄崟鎹夊埌淇″彿錛岄偅涔堢郴緇熷氨浼?xì)涓柇杩欎釜system call -->EINTR, 榪欏湪褰撴椂鏄湁鐞嗙敱鐨勶紝鑰屼笖鐞嗙敱鐪嬭搗鏉ヤ篃鍚堢悊錛屼絾鏄敱浜巙ser鏈夋椂鍊欏茍涓嶇煡閬撴煇浜涚郴緇熻皟鐢ㄦ槸鍚︽槸浣庨熺郴緇熻皟鐢紝BSD寮曡繘浜?jiǎn)鑷姩閲嶅惎鐨勫姛鑳藉Q宭inux follow榪欑瑙勫垯
鐒跺悗鏈夊嚑涓増鏈殑signal鍑芥暟
signal榛樿鑷姩閲嶅惎
_signal(signum, handler, SA_RESTART) 榪欐槸鐢變簬鍦╯igaction涓殑flag涓篠A_RESTART錛屼笂闈ysV鐨勫疄鐜版垜涓嶆兂澶氬啓浜?jiǎn)銆?br />sigaction涔熷氨鏄彲閫夌殑浜?jiǎn)銆?/p>
浣嗕竴鑸垜鍗拌薄涓ソ澶?read/write閮芥槸浼?xì)鑷繁鍒ゆ柇杩斿洖鍊間互鍙?qiáng)errno 鏄惁涓?EINTR錛岀劧鍚巖etry錛屽洜涓轟笂闈㈣繖縐嶆柟寮忎緷璧栫郴緇熷疄鐜幫紝闇瑕佸皢鎵鏈夌殑signal閮借瀹氫負(fù)SA_RESTART錛岄偅涔堝鏋滄湁鏌愪釜淇″彿鍙戠敓鐨勬椂鍊欙紝琚粬INTR鐨勭郴緇熻皟鐢ㄦ墠浼?xì)鑷姩閲嶅惎锛屼笉鐭ラ亾榛樿signal鍦ㄦ敞鍐屽鐞嗚涓虹殑鏃跺欐槸涓嶆槸濡傛錛屾劅瑙変笉澶ソ鐢ㄣ?/p>
alarm鍑芥暟
瀵逛簬寰堝鍍廰larm榪欑鍑芥暟錛屽湪璁捐鏃秓r浣跨敤鏃跺潎搴旇鑰冭檻涓寸晫鍊肩殑闂
alarm鐨勫敮涓鎬э紝鏄痓y process鐨勶紝process鍗曚緥
鎵浠ュ鏋渁larm涓ゆ錛岄偅涔堢涓嬈′細(xì)琚鐩栵紝鎬庝箞澶勭悊絎竴嬈℃湭瀹屾垚鐨勬儏鍐?>榪斿洖鍊間細(xì)甯﹀洖鏉ュ墿浣欑殑鏃墮棿
鎬庝箞鍙栨秷璁懼畾鐨刟larm
浼犲叆鍊間負(fù)0 means cancel
鎬諱箣浜?jiǎn)锛寴q欎釜涓滆タ璁捐鐨勬椂鍊欒繕铔畬鍠勭殑
鍚庨潰榪樻湁涓鍫嗘湁鍏硈ignal鐨勬爣鍑嗗嚱鏁幫紝榪欓噷涔熷氨涓嶄竴涓鍒椾婦
浣滀笟:
1.鍘繪帀for(;;), 閭f崟鎹夊埌SIGUSR1灝辮繑鍥炰簡(jiǎn)錛宲ause()鍙鎹曟崏鍒頒俊鍙鳳紝絳変俊鍙峰鐞嗗畬鏃惰嚜宸卞氨浼?xì)杩斿洖迤堝甫鍥濫INTR銆備笉鏅撳緱涓哄暐鏈夎繖縐嶉鐩?..
2.瀹炵幇sig2str錛岃繖鏈夌偣鏃犺亰浜?:(涓嶅啓
3.鐢籸untime stack鐨勬牱瀛愩?br />4.IO鎿嶄綔鐨勮秴鏃舵渶濂戒笉瑕侀噰鐢╝larm鐨勬柟寮忥紝鍚勭鍘熷瓙闂錛宻elect/poll鏄渶濂界殑閫夋嫨銆?br />鍚庨潰鏈夊ソ涓浜涙槸瑕佸啓浠g爜鐨?..
鎴戠暐鎯籌紝鐒跺悗灝變笉澶効鎰忓啓浜?
PS:鏈変簺涓滆タ鐣ラ毦...鎴戜篃鏄湁鐐規(guī)兂涓嶆竻妤氱殑鏍峰瓙錛屾墦綆楁參鎱㈡悶銆?br />
鍚庨潰鍐沖畾鎶婃爣棰樻敼涓涓嬶紝欏哄埄鐪嬪畬涔﹀惂...Orz.
涓巔rocess鍏寵仈鐨処D
璋乪xecute榪欎釜process鐨勪漢縐頒負(fù)real user id錛屽簲璇ュ氨鏄櫥闄嗘椂浣跨敤鐨剈ser
real group id涔熶竴鏍?
涓鑸湪涓涓櫥闄哠ession涓紝榪欎袱涓奸兘涓嶄細(xì)鏀瑰彉錛屼絾鏄秴綰х敤鎴瘋繘紼嬪彲浠ユ敼鍙?br />鍍廇ndroid涓瘡涓狝PK鏈夌嫭鑷殑User id錛岀劧鍚庣被浼紃ild涔嬬被鐨刵ative deamon process灝變細(xì)灝濊瘯鏀瑰彉鑷繁鐨剈ser id涓虹被浼紃adio涔嬬被鐨勪笢瑗褲?/p>
鍦ㄨ繍琛屼腑媯(gè)鏌ユ潈闄愭墍浣跨敤鐨刬d縐頒負(fù)鏈夋晥鐢ㄦ埛id錛宔ffective user id
鐒跺悗榪樻湁鏈夋晥緇処D
闄勫姞緇処D
涓鑸湁鏁堢敤鎴稩D == 鐪熷疄鐢ㄦ埛ID錛?鏈夋晥緇処D == 鐪熷疄緇処D
浣嗘槸濡傛灉鍦ㄥ彲鎵ц鏂囦歡鐨剆t_mode涓湁璁劇疆 set-user-ID/set-group-ID
閭e湪鎵ц榪欎釜鏂囦歡鐨勬椂鍊?鏈夋晥鐢ㄦ埛ID鍜屾湁鏁堢粍ID浼?xì)鍙樻垚鏂囦欢鐨刼wner
涓鑸湁璁劇疆set-user-ID/set-group-ID鐨勭▼搴忛兘浼?xì)鑾峰緱棰濆鐨勬潈闄?/p>
鍏充簬鏂囦歡鏉冮檺錛屾湁涓浜涘鏄撳紩璧瘋瑙g殑錛屼篃榪樻湁涓浜涙垜鑷繁涔熸病鏈夌悊瑙f竻妤氱殑
鏂囦歡鏉冮檺姣旇緝濂界悊瑙o紝O_TRUNC闇瑕佹枃浠跺叿鏈夊啓鏉冮檺銆?br />
鏂囦歡澶圭殑鍐欐潈闄愶紝搴旇灝辨槸綾諱技鑳戒笉鑳藉湪鍏朵腑create/update/delete鏂囦歡鍜屾枃浠跺す
鏂囦歡澶圭殑璇繪潈闄愶紝搴旇灝辨槸璇繪枃浠跺す閲岄潰鐨勬枃浠?鏂囦歡澶瑰垪琛紝閫氬父鎴戜滑 ls 褰撳墠鏂囦歡澶瑰氨蹇呴』鍏鋒湁璇繪潈闄?br />鏂囦歡澶圭殑鎵ц鏉冮檺錛岃繖涓笢瑗垮惉璇村張鍙悳绱綅錛岄氬父鎴戜滑cd XXX錛屽氨蹇呴』鍦ㄥ綋鍓嶆枃浠跺す涓嬫悳绱XX鏄惁瀛樺湪錛岀劧鍚庡氨鏄綋鎴戜滑璁塊棶綾諱技榪欑寰堥暱璺緞鐨勬枃浠?aaa/bbb/ccc/dd.txt
瀵筧aa錛宐bb錛宑cc蹇呴』鍏鋒湁鎵ц鏉冮檺錛屽氨鏄悳绱?/p>
涓鑸鏋滃叿鏈夎鏉冮檺灝卞簲璇ュ氨鍙互鎼滅儲(chǔ)錛屽鏋滆繖涔嬪墠鏈夊尯鍒紝灝辨槸搴旇鏄悳绱㈢殑鑼冨洿澶т簬鑳借鍒扮殑鍐呭銆?br />涔熷氨鏄箣鍚庨渶瑕佺煡閬撲竴涓狥older鏈韓閲岄潰鏈夊啓浠涔堝唴瀹癸紝鎴戠洰鍓嶇煡閬撶殑鏄竴瀹氭湁褰撳墠鐨勬枃浠跺垪琛?-> TODO: 鐪嬫儏鏅垎鏋?or 鍘葷湅涓?ls 鐨勫疄鐜幫紝ls閲岄潰鏈夋瘮杈冨鍙傛暟鏈変簺鏄渶瑕亁鐨勬湁浜涙槸闇瑕乺鐨勶紝渚嬪 ls -l濡傛灉娌℃湁鎵ц鏉冮檺灝卞彧鑳芥嬁鍒?name ,鑳界煡閬撴槸folder榪樻槸file錛岄櫎姝や箣澶栧叾浠栫殑涓滆タ閮芥嬁涓嶅埌錛屾枃浠舵湰韜殑鏉冮檺錛寀ser錛実roup
-->linux鐩綍涓褰曠殑搴旇鏄彧鏈変袱涓笢瑗?inode & name.榪欎笌鏂囦歡緋葷粺鐨勫疄鐜版湁鍏熾?/span>
鍙﹀澧炲垹鏂囦歡閮介渶瑕乄X鏉冮檺
鍙﹀鍐呮牳瀵規(guī)枃浠舵搷浣滄潈闄愮殑鍒ゆ柇欏哄簭...濡傛灉鏄痮wner灝變細(xì)鐪媜wner鏉冮檺錛実roup鏉冮檺灝變笉浼?xì)鐪嬩簡(jiǎn)锛屽鏋滃湪group涓垯others涔熷氨涓嶇湅浜?jiǎn)锛寴q欎釜閫昏緫涓婃甯革紝鑰屼笖鍙互鎯充竴涓媖ernel鐨勫疄鐜幫紝涓瀹氭槸if-else鐨勫垽鏂嚭緇撴灉鍚庣洿鎺ヨ繑鍥炪?/p>
榪欓噷灝辮鎻愬鏋滄柊寤烘枃浠?鏂囦歡澶圭殑鏃跺欐枃浠跺す鐨刼wner user id鍜実roup id鏄皝
user id浼?xì)鏄痯rocess 鏈夋晥鐢ㄦ埛ID
group id鍙互鏈変袱縐嶉夋嫨鐖秄older鐨刧roup id錛沷r process鏈夋晥緇処D
linux涓牴鎹枃浠剁郴緇熺殑涓嶅悓鏈夌殑鍙互鍦╩ount fs鐨勬椂鍊欓夋嫨
鏂囦歡闀垮害: st_size
lseek鍒版枃浠舵湯灝句箣鍚庣殑絀洪棿錛屼細(xì)鐓ф垚鏂囦歡絀烘礊
鏂囦歡闀垮害浼?絀烘礊鐨勫ぇ灝忥紝浣嗘槸榪欎簺絀烘礊鏈繀浼?xì)鍗犵敤纾佺洏绌洪棿銆?/span>
du 鍛戒護(hù)鍙互鐪嬬鐩樼┖闂村ぇ灝?/span>
絎﹀彿閾炬帴鍜屾墍璋撶殑紜摼鎺ュ畬鍏ㄦ槸涓ゅ洖浜嬶紝寤鴻緇嗚4.14錛屼笉瑕佸幓涓婄綉search綾諱技鎴戣繖縐嶈嚜宸辮褰曠粰鑷繁鐪嬬殑blog...:(
榪欑珷鍐呭姣旇緝澶氳屼笖鏉傦紝涓昏鏄痵tat涓殑姣忎釜鍙傛暟鐨勬剰涔夛紝闇瑕佹濊冩兂娓呮鐨勪笢瑗夸篃姣旇緝澶氾紝鏈夋瘮杈冨鍏充簬鏂囦歡鎿嶄綔鐨凷ystem Call
浣滀笟寮濮?
涔嬪悗鍙啓鏈夌偣鎰忎箟鐨勯鐩紝鏃犳剰涔夌殑涔熸病浠涔堝彲浠ュ啓鐨刾ass
4.1 stat鍜宭stat鐨勫尯鍒紝stat鍩烘湰涓嶄細(xì)鍏沖績(jī)鏄惁鏄疭_IFLNK(絎﹀彿閾炬帴)錛屽簲璇ユ槸鐪嬪埌S_IFLNK浼?xì)寰涓嬪幓鎵劇湡姝g殑File錛岀劧鍚庢嬁鍒板睘鎬у?/span>
鑰宭stat鏃侀亾S_IFLNK鍒欎細(xì)鐩存帴榪斿洖銆傜涓嬈$湅鍒拌繖鏍風(fēng)殑鍑芥暟璁捐鎬殑錛屾垜鐨勫垵濮嬫劅瑙夋槸鍙嶇殑銆傛垜瑙夊緱stat鏄竴涓猚ommon鐨勮璁★紝涓嶄細(xì)閽堝涓嶅悓鐨凢ile綾誨瀷鏉ュ仛涓浜涘尯鍒侽rz...鏈鍚庝笉鏄?/span>
4.2 umask 777鎰忓懗鐫rwxrwxrwx鍏ㄩ儴鍙樻病鎺夛紝浣嗘槸榪欎篃娌″叧緋伙紝涓嶇煡閬撳嚭棰樹(shù)漢鐨勬剰鎬?/span>
4.5 鐩綍鍜岀鍙烽摼鎺ョ殑闀垮害涓嶅彲鑳戒負(fù)0錛岀洰褰曞垱寤哄嚭鏉ュ氨浼?xì)鍖呭? 鍜?..鑰屼笖 . 鐨刬node鎸囧悜鑷繁鏈韓浼?xì)鍗牸倎鐩樈I洪棿錛岀鍙烽摼鎺ヨ偗瀹氫篃鏄笉鑳戒負(fù)0鐨勶紝鍏朵腑鏈夊瓨鎸囧悜鐨勯摼鎺ath
4.6 榪欎釜鏈夌偣鎰忔濓紝鍚庨潰璐翠唬鐮?/span>
4.7 榪欎釜鐪嬩簡(jiǎn)涓嬬瓟妗堬紝娌$湅鎳?gt;涓轟粈涔坘ernel榛樿鐨勫垱寤烘枃浠惰祴浜堢殑鏉冮檺“鍙兘浼?xì)锛屼篃鍙兘涓嶄?#8221;鍙梪nmask鐨勫肩殑褰卞搷?
4.8 du df鐨勫尯鍒?..
4.9 ~ 鍚庨潰鐨勯澶ф鐪嬩簡(jiǎn)涓嬶紝涓嶆兂鍐欎簡(jiǎn)錛屽ソ澶氱粏鑺?..
]]>
#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )
瀹忓姛鑳斤細(xì)鑾峰緱涓涓粨鏋勪綋鍙橀噺鎴愬憳鍦ㄦ緇撴瀯浣撲腑鐨勫亸縐婚噺銆?/strong>
1. ( (TYPE *)0 ) 灝嗛浂杞瀷涓篢YPE綾誨瀷鎸囬拡;
2. ((TYPE *)0)->MEMBER 璁塊棶緇撴瀯涓殑鏁版嵁鎴愬憳;
3. &( ( (TYPE *)0 )->MEMBER )鍙栧嚭鏁版嵁鎴愬憳鐨勫湴鍧錛屽嵆鐩稿浜?鐨勫亸縐婚噺錛岃鐨勫氨榪欎釜;
4.(size_t)(&(((TYPE*)0)->MEMBER))緇撴灉杞崲綾誨瀷錛宻ize_t搴旇鏈緇堜負(fù)unsigned int綾誨瀷銆?
姝ゅ畯鐨勫閥濡欎箣澶勫湪浜庡皢 0 杞崲鎴?TYPE*)錛岃繖鏍風(fēng)粨鏋勪綋涓垚鍛樼殑鍦板潃鍗充負(fù)鍦ㄦ緇撴瀯浣撲腑鐨勫亸縐婚噺銆?br />
榪欓噷涓昏榪樻槸鍒╃敤浜?'->' 榪欎釜絎﹀彿鐨勫姛鑳斤紝緙栬瘧鍣ㄨВ鏋愯繖涓鍙風(fēng)殑鏃跺欏簲璇ュ氨鏄氳繃鍋忕Щ閲忓彇鍊鹼紝鎵浠ヨ繖閲屽厛瀹氫箟濂藉彇鍊艱鍒?TYPE*)鐒跺悗鍒╃敤鍋忕Щ閲忓彇鍊煎弽鍚戝啀鍙栧湴鍧錛屽啀鐒跺悗鍥犱負(fù)璧峰鍦板潃鏄?錛屽彇鍥炵殑鍦板潃灝卞彉鎴愪簡(jiǎn)鐪熸鐨勫亸縐婚噺銆?br />榪樻湁涓涓煡閬搈ember姹傛暣浣撶殑Ptr鐨凪arco搴旇涔熻洰濂界敤錛屾嫭鍙鋒瘮杈冨錛屾垜娌″ご鍘葷湅鍏蜂綋瀹炵幇浜?..
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr – offsetof(type,member) );})
瀹忓姛鑳斤細(xì)浠庣粨鏋勪綋錛?strong>type錛夋煇鎴愬憳鍙橀噺錛?strong>member錛夋寚閽堬紙ptr錛夋潵姹傚嚭璇ョ粨鏋勪綋錛?strong>type錛夌殑棣栨寚閽堛?br />
(2)
鏈夎璁轟竴浜涗笢瑗匡紝娌℃湁鎼炴竻妤氾紝璐村湪榪欓噷浠ュ悗鏈夊績(jī)鍔涗簡(jiǎn)鍐嶇湅錛屽湪鐪婻ild錛岀劧鍚巔thread鍦ㄥ仛綰跨▼鍚屾鐨勬椂鍊欓渶瑕佸厛lock錛屼篃璁稿ぇ瀹墮兘鏄繖鏍峰仛錛屼篃涓鐩磋繖鏍峰仛錛屼絾鏄獊鐒跺氨鎯沖埌涔嬪墠Java鐨勬椂鍊欒璁鴻繃鐨勪笢瑗夸負(fù)浠涔坵ait/notify 涓瀹氳鍦ㄤ竴涓猻ynchronize block涓紝褰撶劧浣犲彲浠ヨ錛屽鏋滀笉浼?xì)鏈塭xception鎶涘嚭錛屼綘涔熻繕鍙互璁瞱ait鏈潵灝變細(xì)鍏堥噴鏀緇ock鐒跺悗鎶婂綋鍓嶇殑thread鏀懼埌Object waiting thread pool涓劧鍚庢寕璧峰綋鍓嶇嚎紼嬶紝瀹炵幇灝辨槸榪欐牱瀛愶紝浣嗘槸浠庤璁℃潵璁詫紝鍘熷洜鎴戞病鏈夋兂鐨勭壒鍒竻妤氾紝濡傛灉涓嶅幓lock錛屾槸涓嶆槸鍥犱負(fù)wait/notify鏈韓鏈夊緢澶氭搷浣滄病鍔炴硶鍋歮ulti thread...
鐒跺悗灝辨槸鍏充簬select鐨勪竴浜涜緟鍔╃殑Marco錛岀被浼糉D_SET錛孎D_ZERO涔嬬被鐨勶紝綆鍗曡灝辨槸涓涓猯ong鏁扮粍錛屾瘡涓厓绱犵殑姣忎釜bit浠h〃涓涓猣d錛岀劧鍚庡仛set錛宑lear涔嬬被鐨勫姩浣滐紝鏈澶т笉鑳借秴榪囬偅涓?024
浠婂ぉ鍏堝埌榪欓噷錛屽啓涓簭錛屾槑澶╂鏂?..Orz
(3)
緇х畫(huà)璁ㄨ涓滆タ
鏈変漢涓轟簡(jiǎn)鍦–++涓綔鍑虹被浼糐ava鍙互鑷姩閲婃斁鍐呭瓨鐨勪笢瑗匡紝涔熷氨鏄墍璋撶殑鏅鴻兘鎸囬拡錛孉ndroid鏈夊府蹇欏疄鐜皊trong pointer/weak pointer錛屼粬鐨勫ぇ姒傛剰鎬濆氨鏄敤涓涓涓夎呮潵鐪嬩綇褰撳墠new鍑烘潵鐨刼bject錛岄噰鐢ㄧ殑鏂瑰紡涓鑸槸寮曠敤璁℃暟錛岃繖縐嶆柟寮忎篃璁稿湪Design Pattern涓湁涓撻棬鐨勫悕瀛椼備竴鑸埄鐢ㄧ紪璇戝櫒瀵硅繖涓涓夎呭仛鑷姩閲婃斁鐨勬椂鍊欏幓媯(gè)鏌ヨ鏁板櫒錛岀湅鏄惁鑳介噴鏀句粬鐪嬬鐨刼bject錛孋++閲岄潰緙栬瘧鍣ㄤ細(xì)鑷姩鍘籧all ~Constructor灝變緥濡傚眬閮ㄥ彉閲忋?br />
鏈変竴浜涘鏉傜殑Case錛屽氨綆楁槸浜ゅ弶寮曠敤浜?jiǎn)锛孲trong Pointer/Weak Pointer灝辨槸涓轟簡(jiǎn)瑙e喅浜ゅ弶寮曠敤鐨勯棶棰橈紝浠庤涔変笂璁茬埗Object寮曠敤瀛怬bject錛岀敤SP錛屽弽榪囨潵鐢╓P
鍙SP涓?錛屽氨鍙互閲婃斁Memory
浠婂ぉ澶у鏈夎Java鐨刉eakReference錛孲oftReference錛屾垜灝卞惈緋婁簡(jiǎn)錛屾垜浠ヤ負(fù)榪欎笢瑗垮拰涓婇潰涓鏍楓?br />Java鐨刉eakReference錛孲oftReference璺熶笂闈㈣鐨勫畬鍏ㄤ笉涓鏍鳳紝鐢變簬娌″垎娓呮錛屾販娣嗕簡(jiǎn)銆侸VM灝變細(xì)澶勭悊寮曠敤浜ゅ弶鐨勯棶棰橈紝JVM澶勭悊寮曠敤浜ゅ弶鍙互浣跨敤綾諱技鏈夊悜鍥撅紝濡傛灉鍛堢幆鐘惰屼笖鐜腑鐨勪換鎰忕偣閮芥病鍔炴硶鍒癎C Roots(VM stack涓殑Reference/static reference/JNI reference)錛岄偅涔堝氨閮紾C鎺夊簲璇ヤ篃娌¢棶棰樸?br />鎵浠ava涓殑鎵璋撶殑WeakReference/SoftReference璺烻P/WP涓嶄竴鏍鳳紝Java涓櫘閫氳祴鍊肩殑reference閮芥槸寮哄彲鍙?qiáng)鐨凷trong Reference銆?br />WeakReference鍙槸鐢ㄦ潵鍏沖績(jī)涓嬮偅浜涘皢瑕佽鍥炴敹鍗存病鏈夊洖鏀剁殑Object錛屼竴鏃﹁GC Thread鎵埌灝變細(xì)琚噴鏀俱?br />鑰孲oftReference鏄疛VM瀵筄bject鐨凜ache錛屽彧瑕佸唴瀛樿凍澶熶笉浼?xì)琚噴鏀俱?br />
璐翠竴涓Android SP/WP鐨勯摼鎺ワ紝涔嬪墠鏈夊嵃璞$湅榪囥?br />http://blog.csdn.net/luoshengyang/article/details/6786239
(4)
Keep Thinking...
鏌愪漢璁╂垜鍐欎竴涓鐞嗗瓧絎︿覆鐨勫嚱鏁幫紝30min錛?nbsp;鎴戞庝箞涔熶笉鑳借浠栧け鏈涚殑錛屾槸鍚鏃犺11鐐瑰鐨勬椂鍊欐垜澶存湁澶氭檿錛屾垜寰堝紑蹇?jī)鐨勫湪閭i噷鍐欏Q屽緢鐩寸櫧鐨勮錛屾垜鑷繁鐢ㄧ殑鏈槸涓父鎴忔満錛屾病鍟ュソ鐜銆傜敤C鍐欎簡(jiǎn)涓紝鐒跺悗璺戝嚭鏉ョ殑緇撴灉鍑轟箮棰勬枡錛屾垜鎯沖彲鑳芥槸闀挎椂闂存寚鎵嬬敾鑴氭儻浜?jiǎn)~浠旂粏鎯充簡(jiǎn)涓嬩竴浜涙枃浠舵搷浣?br />
鐒跺悗浠旂粏鐪嬩簡(jiǎn)涓涓嬩簩榪涘埗鏂囦歡鍜屾枃鏈枃浠訛紝榪欎篃鏄籂姝d箣鍓嶇殑涓浜涚枒鎯戙?br />鍩烘湰姒傚康鏄?
鎴戣嚜宸辨劅瑙夋枃鏈枃浠跺拰浜岃繘鍒舵枃浠舵病鍟ュ尯鍒紝鏂囨湰鏂囦歡灝辨槸鏈夋槑紜櫘閫氳В鐮佹柟寮忕殑鏄劇ず瀛楃鐨勬枃浠訛紝鍙互鐞嗚В璇存枃鏈枃浠朵篃鏄竴縐嶄簩榪涘埗鏂囦歡錛屽彧涓嶈繃榪欎釜浜岃繘鍒舵枃浠剁殑瑙g爜鏂瑰紡鏄浐瀹氬ソ鐨?ASCII/UTF-8涔嬬被)
鐒跺悗灝辨槸璇誨啓鏂囨湰鏂囦歡鏃跺湪Windows涓婃湁涓浜涜漿鎹紝鍐欑殑鏃跺欎細(xì)鍦╘n鍓嶉潰鑷姩鍔犱笂\r錛岃鐨勬椂鍊欏弽榪囨潵錛孡inux鍒欐病鏈夊尯鍒?br />
鏈変竴浠朵簨鎯呮槸瑕佹槑紜煡閬撶殑
鍍弍rintf涔嬬被鐨勪笢瑗匡紝甯姪鎴戜滑杈撳嚭鐨勶紝鍏跺疄鎴戜滑寰printf閲岄潰濉炵殑鏄?int 鍊鹼紝榪欐槸涓涓簩榪涘埗鐨勫鹼紝浣嗘槸鎴戜滑浠巗tdout涓湅鍒扮殑鍒欏凡緇忓彉鎴愪簡(jiǎn)瀛楃錛屼竴瀹氭湁浜哄府蹇欏仛浜?jiǎn)铦{鎹?
鎴戝師鏈互涓簆rintf浼?xì)鏄瘚個(gè)鏌ョ洰鏍囨枃浠訛紝濡傛灉鐩爣鏂囦歡涓轟簩榪涘埗鍒欑洿鎺ヨ緭鍑哄師鏈殑鍊鹼紝濡傛灉鐩爣涓烘枃鏈枃浠跺氨杈撳嚭瀵瑰簲鍊肩殑瀛楃
榪欑鐞嗚В鏄敊鐨勶紝涓嶅悓鐨勮緭鍏ヨ緭鍑哄嚱鏁板甫鏉ヤ簡(jiǎn)涓嶅悓鐨勭粨鏋?br />綾諱技printf榪欑鏍煎紡璇濊緭鍑哄嚱鏁幫紝浼?xì)鎶婅緭鍑哄唴瀹规寜鐓у瓧绗︿互榛樿鐨劸~栫爜鏂瑰紡encode鏀懼叆鏂囦歡錛屾墍浠ラ偅涓枃浠墮噷闈㈠啓鐨勫煎凡緇忔槸鐪熷疄鍊肩殑涓縐嶆樉紺烘柟寮?瀛楃)浜?br />鐒跺悗scanf榪欑鍑芥暟鍦ㄨ鐨勪箣鍚庯紝涔熶細(xì)鎶婂瓧絎﹁漿鎹負(fù)瀵瑰簲鐨勫鹼紝涓鑸珹SCII灝辯洿鎺?-0x30浜?br />
鍍弐ead/write榪欑function浠栦滑涓嶄細(xì)鍋氫換浣曡漿鎹紝鐩存帴灝辨妸鍊兼斁榪涘幓浜?jiǎn)锛屾墍浠ヤ綘鐢ㄦ枃鏈枃浠舵墦寮鐨勬椂鍊欙紝鎸夌収榛樿鐨刣ecode鏂瑰紡鏉ヨВ鏋愪粬鐨勬椂鍊欎細(xì)鍙戠幇鏄貢鐮併?br />
榪欎釜涓滆タ涓庢枃鏈枃浠朵簩榪涘埗鏂囦歡娌℃湁鍏崇郴銆?br />涓嶇煡閬撴槸涓嶆槸鎴戣嚜宸卞緢寮憋紝鐜板湪鎵嶇煡閬撹繖涓笢瑗褲?br />
浣滀笟緇堜簬寮濮?
3.1 榪欑珷涓昏璁叉枃浠禪nbuffered IO錛岃繖閲岀殑unbuffered鏄寚userspace娌℃湁buffer鏉ョ紦鍐詫紝kernel涓瀹氳繕鏄湁緙撳啿鐨勶紝涓鑸瑄serspace鐨勭紦鍐插仛鍦ㄦ爣鍑咰 lib涓?br />鍙﹀鍍廇ndroid榪欑鏋舵瀯Java layer浼?xì)鍋毦~撳啿(BufferedInputStream/BufferedOutputStream, 榛樿鏄?K)
Java layer鐨勭紦鍐插彲浠ュ噺灝?JNI 璋冪敤嬈℃暟
C lib緙撳啿鍙互鍑忓皯 system call 鐨勬鏁?br />
3.2 鑷繁瀹炵幇dup2
涓嶈兘鐢╢cntl閭e氨鍙兘鐢╠up浜?br />榪欓噷鏄兂瑕佽鍋氶鐨勪漢鐭ラ亾錛宬ernel瀵硅繘紼嬫枃浠舵弿榪扮鐨勫垎閰嶅師鍒欐槸 "鍙栨渶灝忕殑娌℃湁浣跨敤鐨?
鎵浠ョ敤dup瀹炵幇Mydup(fd1, fd2)
1.fd2 < fd1: close fd2; dup(fd1)寰楀埌鐨勫煎氨鏄痜d2
2.fd2 = fd1: 鐩存帴return fd1
3.fd2 > fd1: 閭e氨鍙兘鏃犻檺dup浜?jiǎn)锛岀洿鍒皹q斿洖鍊間負(fù)fd2錛岀劧鍚巆lose鎺?fd1 ~ fd2-1
榪欓噷闇瑕佸鏂囦歡鎻忚堪絎﹁〃錛屾枃浠惰〃錛宨node涔嬬被鐨勬蹇電啛鎮(zhèn)夈?br />
3.3
榪欓噷涓昏鏄璇存枃浠惰〃欏圭殑鍒嗛厤錛屾瘡嬈pen kernel閮戒細(xì)鍒嗛厤鏂扮殑鏂囦歡琛ㄩ」錛宒up鐨勪綔鐢ㄥ氨鏄嬁鍒板彟澶栦竴涓枃浠舵弿榪扮鎸囧悜鐩稿悓鐨勬枃浠惰〃欏癸紝浣嗘槸姣忔敮鏂囦歡鍙湁鍚屼竴浠?br />inode銆?br />fd1錛宖d2浼?xì)鎸囧悜鍚屼竴浠芥枃浠惰〃欏?br />fd1錛宖d2錛宖d3鐨勬枃浠惰〃欏逛細(xì)鎸囧悜鍚屼竴浠絠node
fcntl 浣滅敤浜巉d1錛孎_SETFD鐢ㄦ潵璁懼畾 close_on_exec 鏍囧織榪欎釜涓滆タ鏄湪鏂囦歡鎻忚堪絎︿腑鐨勶紝鎵浠ュ彧浼?xì)濯?jiǎng)鍝峟d1
濡傛灉鏄疐_SETFL鍒欎細(xì)褰卞搷fd1, fd2鏂囦歡鐘舵佹爣蹇楅兘鏀懼湪鏂囦歡琛ㄤ腑銆?br />
3.4
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
if (fd > 2) close(fd);
榪欎釜涓滆タ鐨勪綔鐢ㄥ簲璇ュ氨鏄噸瀹氬悜鏍囧噯杈撳叆杈撳嚭鍜岄敊璇緭鍑哄埌fd.
3.5
娌′粈涔堥噸瑕佺殑錛宻hell鍛戒護(hù)涓瀹氭槸浠庡乏寰鍙寵В鏋愭墽琛岀殑
3.6
铏界劧鏄痑ppend鏂瑰紡鎵撳紑錛岃繖涓笢瑗挎槸閽堝鍐欙紝lseek鍙互鑷繁閫夊畾璇誨彇浣嶇疆銆?br />write鍑芥暟鏄惁鏄細(xì)姣忔鍏坙seek鍒版枃浠跺熬閮?鐒跺悗鍐嶅啓錛岃繖鏍蜂箣鍓峫seek鐨勮緗氨鏃犳晥浜?br />灝忎笢瑗塊獙璇併?/p>
鍚庨潰璐翠笅浠g爜
append浼?xì)濯?jiǎng)鍝嶆瘡嬈rite錛屽彧瑕佹槸O_APPEND鎵撳紑錛屾瘡嬈rite閮戒細(xì)娣誨姞鍒版枃浠舵湯灝俱?br />
Done
鍔犱竴鐐瑰va_list/va_arg/va_end鐨勮娉曪紝鍏跺疄浠栫殑瀹炵幇铔伒媧葷殑
璁板綍涓浜涘叧浜庣郴緇熸葷嚎涓嶤PU“浣嶆暟"鐨勫熀鏈蹇?/p>
閫氬父鎵璇寸殑CPU鐨勪綅鏁幫紝32浣峯r64浣岰PU錛屾寚鐨勬槸ALU(綆楁湳閫昏緫鍗曞厓)鐨勫搴︼紝涔熷氨鏄繖涓狝LU澶勭悊鏁版嵁鐨勫熀鏈崟鍏冪殑瀹藉害
鎵浠ユ暟鎹葷嚎鍩烘湰浼?xì)鍜孉LU瀹藉害鐩稿悓(鏈変緥澶栵紝榪欎釜鎴戞病鎯蟲(chóng)竻妤氬伐浣滃師鐞? -->搴旇鏄彲浠ユ柊鍔犱竴浜汳odule鏉ュ仛杞崲銆?br />鑰屽湴鍧鎬葷嚎鍒欐槸CPU瀵誨潃鐨勮兘鍔涳紝涓涓槸鎬庝箞鍘誨鍧錛屼竴涓槸瀵誨埌鍦板潃鍚庯紝鍦板潃涓唴瀹圭殑瀹藉害(褰撶劧榪欎釜瀹藉害璺熷湴鍧綾誨瀷(byte錛宻hort錛宨nt)鏈夊叧錛屼絾閫佺粰C(jī)PU鐨勬椂鍊欎竴鑸槸鍗曚綅嬈℃暟閫佹暟鎹葷嚎鐨勫搴︾殑鏁版嵁)錛屽湴鍧鎬葷嚎鍐沖畾CPU鑳借闂殑Memory鐨勮寖鍥淬?/p>
8086鏄?6浣岮LU 20浣嶆暟鎹葷嚎瀵誨潃1M
姣忔CPU閫佸嚭鐨勫湴鍧閮芥槸16浣嶏紝鐒跺悗鍔犱笂孌靛瘎瀛樺櫒浣滀負(fù)鏈楂?浣?