時間:2018-08-22 00:00:00 來源:信盈達 作者:信盈達
對于fork這個函數(shù)相信大家都不陌生。我們知道他會創(chuàng)建一個子進程,返回兩個值,也有fork會返回兩次這么個說法。那今天在這里我們就來整理一下對這個函數(shù)的認(rèn)識。
對于fork會返回兩次這個說法我不知道大家都是怎么理解的,“返回一次然后又返回了一次”,在剛接觸這個函數(shù)的時候有許多同學(xué)都是這樣認(rèn)為的。那在這里呢我們就來對這個說法進行一下剖析。
首先我們知道,在進程內(nèi)調(diào)用fork之后,如果調(diào)用成功會怎樣啊?沒錯,他會創(chuàng)建出一個子進程,但是創(chuàng)建出來的這個子進程在哪里呢?這里呢就涉及到了進程結(jié)構(gòu)的組成知識。首先我們來看,一個進程在虛擬地址上由低到高依次存儲著正文段,數(shù)據(jù)段(這里我們把初始化和未初始化的數(shù)據(jù)統(tǒng)稱為數(shù)據(jù)段),和堆棧段,主要呢是這三個段。那我們說正文段,它有著只讀共享的屬性。也就是說,對于一個程序,我們可以多次運行,但是它們運行起來卻是不同的進程。那這些不同的進程是不是共享著同一個正文段啊。那我們的fork函數(shù)也一樣,在進程調(diào)用fork函數(shù)之后,子進程產(chǎn)生,子進程與調(diào)用fork的進程,也就是父進程共享著同一個正文段。在fork函數(shù)成功返回之后,也就是有兩個進程同時運行著同一個正文段。我們來看一下下面這段注釋:
pid = fork();
if(pid < 0)
{
perror{};
exit(1);
}
/* 此時有兩個程序運行到這 */
else if(pid == 0)
{
/*子進程代碼*/
}else
{
/*父進程代碼*/
}
我們來看上面這段代碼的注釋,也就是說在fork成功返回之后,會有兩個程序同時運行到 /*此時有兩個程序運行到這*/這個注釋處,此時父子進程里的fork便已經(jīng)返回了不同的值。在父進程中,父進程的fork返回了一個大于0的數(shù),我們都知道那是子進程的PID;在子進程中,子進程的fork返回了一個0,表示此進程是由別的進程fork出來的。那我們的父子進程都會接著向下運行,判斷下面的else if。在父進程中,由于fork返回值大于0,故else if(pid == 0)這個判斷語句不成立,然后執(zhí)行下面的else里面的代碼。在子進程中,pid是等于0的,也就是說子進程在判斷了else if(pid == 0)條件后發(fā)現(xiàn)條件成立,然后它去執(zhí)行里面的代碼。這樣的fork框架就可以讓我們父子進程在同一個正文段中區(qū)分各自進程的代碼塊。
那現(xiàn)在我們再來看這個“fork會返回兩次”的說法還嚴(yán)謹(jǐn)嗎?沒錯,我們fork也是只會返回一次的,只不過在不同的進程中(調(diào)用者和被創(chuàng)建者)它返回的值不一樣罷了,然后由于共用同一個正文段,所以會給我們造成返回兩次的錯覺。
信盈達2008年在深圳特區(qū)南山高新科技園成立。自成立至今近九年來專注為企業(yè)和個人提供高端方案設(shè)計、高端嵌入式/Android培訓(xùn)等服務(wù)。公司下設(shè)信盈達實訓(xùn)學(xué)院、信盈達研發(fā)中心、信盈達教學(xué)儀器三大業(yè)務(wù)板塊。九年來公司堅持"技術(shù)領(lǐng)先、服務(wù)領(lǐng)先",以雄厚的實力和專業(yè)的品質(zhì)成為國內(nèi)唯一有實力從產(chǎn)品最底層研發(fā)到系統(tǒng)層開發(fā)的嵌入式實訓(xùn)、產(chǎn)品解決方案提供商。為中國IT行業(yè)提供最具價值的職業(yè)教育服務(wù)。專業(yè)培訓(xùn)嵌入式、物聯(lián)網(wǎng)、人工智能、Java、單片機等課程,想了解更多信息點擊立馬咨詢
免費領(lǐng)取試聽卡
申請已經(jīng)提交
老師會馬上給您安排試聽課程!
申請出錯了
您可以加老師QQ:914865590報名咨詢!