Posted on 2013-05-14 17:26
hoshelly 閱讀(340)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Linux
1.1
fork可以創(chuàng)建一個(gè)新的子進(jìn)程,調(diào)用一次,返回兩次,一次返回0值給子進(jìn)程,另一次返回新的子進(jìn)程的ID給父進(jìn)程 。子進(jìn)程是父進(jìn)程的復(fù)制品,擁有父進(jìn)程的數(shù)據(jù)空間、堆和棧,父子進(jìn)程并不共享存儲(chǔ)空間,如果正文段是只讀的,那么父子進(jìn)程共享正文段。一般而言,fork之后是父進(jìn)程先執(zhí)行還是子進(jìn)程先執(zhí)行是不確定的,這取決于內(nèi)核的調(diào)度算法。fork有兩種用法:(1)一個(gè)父進(jìn)程希望復(fù)制自己,使父、子進(jìn)程同時(shí)執(zhí)行不同的代碼段。這在網(wǎng)絡(luò)服務(wù)進(jìn)程中是常見的——父進(jìn)程等待委托者的服務(wù)請(qǐng)求。當(dāng)這種請(qǐng)求到達(dá)時(shí),父進(jìn)程調(diào)用 f o r k,使子進(jìn)程處理此請(qǐng)求。父進(jìn)程則繼續(xù)等待下一個(gè)服務(wù)請(qǐng)求。(2) 一個(gè)進(jìn)程要執(zhí)行一個(gè)不同的程序。這對(duì)s h e l l是常見的情況。在這種情況下,子進(jìn)程在從f o r k返回后立即調(diào)用e x e c。
1.2
vfork用于創(chuàng)建一個(gè)新的進(jìn)程,而新的進(jìn)程的目的就是exec一個(gè)新程序,vfork并不將父進(jìn)程的地址空間復(fù)制給子進(jìn)程,因?yàn)樽舆M(jìn)程會(huì)立即調(diào)用exec(_exit),于是也就不會(huì)訪問(wèn)地址空間。不過(guò)它在調(diào)用exec或_exit之前,它在父進(jìn)程的空間中運(yùn)行。
fork創(chuàng)建的子進(jìn)程共享父進(jìn)程的數(shù)據(jù)段、堆棧段;vfork創(chuàng)建的子進(jìn)程共享父進(jìn)程的數(shù)據(jù)段。
vfork與fork的另一個(gè)區(qū)別是:vfork保證子進(jìn)程先運(yùn)行,在它調(diào)用exec或exit之后父進(jìn)程才可能被調(diào)度運(yùn)行,(如果在調(diào)用這兩個(gè)函數(shù)之前子進(jìn)程依賴于父進(jìn)程的進(jìn)一步動(dòng)作,則會(huì)導(dǎo)致死鎖)。
2.1
exit和_exit都是正常終止進(jìn)程,_exit用于vfork時(shí)父進(jìn)程有可能會(huì)被調(diào)度,它們都不同于異常終止abort,在異常終止情況下,內(nèi)核(不是進(jìn)程)產(chǎn)生一個(gè)指示其終止異常終止原因的終止?fàn)顟B(tài)。