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