![]() |
|
Linux下多進(jìn)程編程之fork()函數(shù)說明 |
|
fork()函數(shù) 在Linux中創(chuàng)建一個新進(jìn)程的唯一方法是使用fork()函數(shù)。fork()函數(shù)是Linux中一個非常重要的函數(shù),和讀者以往遇到的函數(shù)有一些區(qū)別,因?yàn)樗雌饋韴?zhí)行一次卻返回兩個值。難道一個函數(shù)真的能返回兩個值嗎?希望讀者能認(rèn)真地學(xué)習(xí)這一部分的內(nèi)容。 1)fork()函數(shù)說明 fork()函數(shù)用于從已存在的進(jìn)程中創(chuàng)建一個新進(jìn)程。新進(jìn)程稱為子進(jìn)程,而原進(jìn)程稱為父進(jìn)程。使用fork()函數(shù)得到的子進(jìn)程是父進(jìn)程的一個復(fù)制品,它從父進(jìn)程處繼承了整個進(jìn)程的地址空間,包括進(jìn)程上下文、代碼段、進(jìn)程堆棧、內(nèi)存信息、打開的文件描述符、信號控制設(shè)定、進(jìn)程優(yōu)先級、進(jìn)程組號、當(dāng)前工作目錄、根目錄、資源限制和控制終端等,而子進(jìn)程所獨(dú)有的只有它的進(jìn)程號、資源使用和計時器等。 因?yàn)樽舆M(jìn)程幾乎是父進(jìn)程的完全復(fù)制,所以父子兩個進(jìn)程會運(yùn)行同一個程序。這就需要用一種方式來區(qū)分它們,并使它們照此運(yùn)行,否則,這兩個進(jìn)程不可能做不同的事。 實(shí)際上是在父進(jìn)程中執(zhí)行fork()函數(shù)時,父進(jìn)程會復(fù)制出一個子進(jìn)程,而且父子進(jìn)程的代碼從fork()函數(shù)的返回開始分別在兩個地址空間中同時運(yùn)行,從而使兩個進(jìn)程分別獲得其所屬fork()函數(shù)的返回值,其中在父進(jìn)程中的返回值是子進(jìn)程的進(jìn)程號,而在子進(jìn)程中返回0。因此,可以通過返回值來判定該進(jìn)程是父進(jìn)程還是子進(jìn)程。 同時可以看出,使用fork()函數(shù)的代價是很大的,它復(fù)制了父進(jìn)程中的代碼段、數(shù)據(jù)段和堆棧段里的大部分內(nèi)容,使得fork()函數(shù)的系統(tǒng)開銷比較大,而且執(zhí)行速度也不是很快。 本文選自華清遠(yuǎn)見嵌入式培訓(xùn)教材《從實(shí)踐中學(xué)嵌入式Linux應(yīng)用程序開發(fā)》 熱點(diǎn)鏈接:
1、Linux下多任務(wù)系統(tǒng)之線程介紹 |