|  | |
| Linux下多進程編程之fork()函數說明 | |
| fork()函數 在Linux中創建一個新進程的唯一方法是使用(yong)fork()函(han)數(shu)(shu)。fork()函(han)數(shu)(shu)是Linux中一個非常重要(yao)的函(han)數(shu)(shu),和讀者(zhe)(zhe)以往遇到的函(han)數(shu)(shu)有(you)一些區別(bie),因為它看(kan)起來執行(xing)一次卻返回(hui)兩個值。難道一個函(han)數(shu)(shu)真的能(neng)返回(hui)兩個值嗎(ma)?希望(wang)讀者(zhe)(zhe)能(neng)認(ren)真地(di)學習這(zhe)一部分(fen)的內容。 1)fork()函數說明 fork()函數用(yong)于(yu)從(cong)(cong)已存在的(de)(de)(de)進(jin)(jin)(jin)程(cheng)(cheng)(cheng)中創(chuang)建一(yi)(yi)個(ge)(ge)新(xin)進(jin)(jin)(jin)程(cheng)(cheng)(cheng)。新(xin)進(jin)(jin)(jin)程(cheng)(cheng)(cheng)稱為子進(jin)(jin)(jin)程(cheng)(cheng)(cheng),而原進(jin)(jin)(jin)程(cheng)(cheng)(cheng)稱為父進(jin)(jin)(jin)程(cheng)(cheng)(cheng)。使用(yong)fork()函數得到的(de)(de)(de)子進(jin)(jin)(jin)程(cheng)(cheng)(cheng)是父進(jin)(jin)(jin)程(cheng)(cheng)(cheng)的(de)(de)(de)一(yi)(yi)個(ge)(ge)復(fu)制(zhi)品(pin),它從(cong)(cong)父進(jin)(jin)(jin)程(cheng)(cheng)(cheng)處繼承(cheng)了整個(ge)(ge)進(jin)(jin)(jin)程(cheng)(cheng)(cheng)的(de)(de)(de)地址空間,包(bao)括進(jin)(jin)(jin)程(cheng)(cheng)(cheng)上下文、代碼段、進(jin)(jin)(jin)程(cheng)(cheng)(cheng)堆棧、內存信(xin)息、打(da)開的(de)(de)(de)文件描述符、信(xin)號控制(zhi)設定、進(jin)(jin)(jin)程(cheng)(cheng)(cheng)優先級、進(jin)(jin)(jin)程(cheng)(cheng)(cheng)組號、當前工作目錄、根目錄、資源限制(zhi)和(he)控制(zhi)終端等,而子進(jin)(jin)(jin)程(cheng)(cheng)(cheng)所獨有的(de)(de)(de)只有它的(de)(de)(de)進(jin)(jin)(jin)程(cheng)(cheng)(cheng)號、資源使用(yong)和(he)計(ji)時器等。 因(yin)為子進(jin)(jin)程幾乎是父進(jin)(jin)程的(de)完全復制,所以父子兩個進(jin)(jin)程會(hui)運(yun)行同一(yi)個程序。這(zhe)就需要用一(yi)種方式(shi)來區分它(ta)們,并使它(ta)們照此運(yun)行,否(fou)則(ze),這(zhe)兩個進(jin)(jin)程不可(ke)能做不同的(de)事。 實際上是(shi)在(zai)父(fu)(fu)進(jin)程(cheng)(cheng)(cheng)(cheng)中(zhong)(zhong)執行fork()函(han)數(shu)時,父(fu)(fu)進(jin)程(cheng)(cheng)(cheng)(cheng)會復制出(chu)一(yi)個(ge)子(zi)進(jin)程(cheng)(cheng)(cheng)(cheng),而(er)且父(fu)(fu)子(zi)進(jin)程(cheng)(cheng)(cheng)(cheng)的(de)(de)代碼從(cong)fork()函(han)數(shu)的(de)(de)返回(hui)開始分(fen)別在(zai)兩個(ge)地址空間中(zhong)(zhong)同時運行,從(cong)而(er)使兩個(ge)進(jin)程(cheng)(cheng)(cheng)(cheng)分(fen)別獲得其(qi)所屬fork()函(han)數(shu)的(de)(de)返回(hui)值,其(qi)中(zhong)(zhong)在(zai)父(fu)(fu)進(jin)程(cheng)(cheng)(cheng)(cheng)中(zhong)(zhong)的(de)(de)返回(hui)值是(shi)子(zi)進(jin)程(cheng)(cheng)(cheng)(cheng)的(de)(de)進(jin)程(cheng)(cheng)(cheng)(cheng)號,而(er)在(zai)子(zi)進(jin)程(cheng)(cheng)(cheng)(cheng)中(zhong)(zhong)返回(hui)0。因此,可以通(tong)過返回(hui)值來(lai)判定該(gai)進(jin)程(cheng)(cheng)(cheng)(cheng)是(shi)父(fu)(fu)進(jin)程(cheng)(cheng)(cheng)(cheng)還是(shi)子(zi)進(jin)程(cheng)(cheng)(cheng)(cheng)。 同(tong)時可以看(kan)出,使用(yong)fork()函數的代價是很大(da)的,它復制了(le)父進程中(zhong)的代碼段(duan)(duan)、數據段(duan)(duan)和堆棧段(duan)(duan)里的大(da)部分內容,使得fork()函數的系統開(kai)銷比較大(da),而且執行(xing)速度(du)也不(bu)是很快。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱(re)點鏈接: 
         1、Linux下多任務系統之線程介紹 |