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