0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

fork和vfork有什么區(qū)別 簡(jiǎn)述fork與vfork的區(qū)別

學(xué)益得智能硬件 ? 來(lái)源:學(xué)益得智能硬件 ? 2023-08-03 17:12 ? 次閱讀

fork和vfork有什么區(qū)別,作為嵌入式工程師,這個(gè)肯定是要掌握的。

不管是fork還是vfork,他們都是為了創(chuàng)建子進(jìn)程。

函數(shù)原型一樣,沒有參數(shù),但是返回值比較奇怪,別的函數(shù)都是只有一個(gè)返回值,但是fork和vfork有兩個(gè)。

#include 
#include 


int main()
{
    pid_t pid = fork();
    if (-1 == pid)
    {   
        perror("fork");
        exit(-1);
    }   
    else if (0 == pid)
    {   
        printf("this is child ...
");
    }   
    else 
    {   
        printf("this is parent ...
");
    }


    return 0;
}
就拿fork來(lái)說(shuō),程序剛運(yùn)行的時(shí)候,只有一個(gè)父進(jìn)程在運(yùn)行,執(zhí)行了fork系統(tǒng)調(diào)用后,多了一個(gè)子進(jìn)程,你可以理解成有兩個(gè)人在執(zhí)行這段代碼,父進(jìn)程的fork返回子進(jìn)程的ID,子進(jìn)程的fork返回0,所以代碼運(yùn)行的現(xiàn)象就是fork存在兩個(gè)返回值,if語(yǔ)句會(huì)進(jìn)入兩個(gè)分支。

fork和vfork的最大區(qū)別就是:fork產(chǎn)生的子進(jìn)程會(huì)復(fù)制父進(jìn)程的地址空間,在內(nèi)核的進(jìn)程表中創(chuàng)建一個(gè)新的進(jìn)程表項(xiàng),新的進(jìn)程表項(xiàng)有很多屬性和原進(jìn)程一樣,像堆棧、數(shù)據(jù)段、文件描述符這些都會(huì)直接從父進(jìn)程中繼承過(guò)來(lái),而且兩個(gè)進(jìn)程的代碼也一樣。

要說(shuō)不一樣的地方,比如進(jìn)程號(hào)、父進(jìn)程號(hào)肯定不一樣。

那vfork有什么使用場(chǎng)景,如果fork產(chǎn)生子進(jìn)程后,子進(jìn)程立馬調(diào)用exec函數(shù)族啟動(dòng)了一個(gè)新的進(jìn)程,那么fork產(chǎn)生的地址空間必將浪費(fèi)。

于是就有了vfork函數(shù),它最大的特點(diǎn)就是父子進(jìn)程共享同一塊地址空間,這樣也不用給子進(jìn)程分配資源,因?yàn)樽舆M(jìn)程接下來(lái)會(huì)被一個(gè)全新的進(jìn)程替換。

除了共享資源上的區(qū)別,還有一些,比如fork產(chǎn)生的子進(jìn)程和父進(jìn)程的運(yùn)行順序不一定,由系統(tǒng)決定,但是vfork產(chǎn)生的子進(jìn)程一定比父進(jìn)程先運(yùn)行。

最后,再來(lái)看一下vfork的man手冊(cè)。

07b28cec-31dd-11ee-9e74-dac502259ad0.png

它提到了有些人認(rèn)為vfork是一種架構(gòu)缺陷,因?yàn)閒ork有了寫時(shí)拷貝機(jī)制,所以在有些場(chǎng)景下使用fork再去通過(guò)exec啟動(dòng)新的進(jìn)程也沒問題。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PID控制
    +關(guān)注

    關(guān)注

    10

    文章

    460

    瀏覽量

    40096
  • printf函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    5893
  • PID技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    1968

原文標(biāo)題:fork和vfork的區(qū)別

文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux下多進(jìn)程編程之fork()函數(shù)語(yǔ)法

    ,因此執(zhí)行速度是比較慢的。為了加快fork()的執(zhí)行速度,很多UNIX系統(tǒng)設(shè)計(jì)者創(chuàng)建了vfork()。vfork()也能創(chuàng)建新進(jìn)程,但它不產(chǎn)生父進(jìn)程的副本。它是通過(guò)允許父子進(jìn)程可訪問相同物理內(nèi)存,從而偽裝
    發(fā)表于 08-19 09:28

    最常見的fork用法是什么

    接口語(yǔ)法用來(lái)創(chuàng)造一個(gè)子進(jìn)程在子進(jìn)程中,成功的fork調(diào)用會(huì)返回 0。在父進(jìn)程中fork返回子進(jìn)程的 pid。如果出現(xiàn)錯(cuò)誤,fork返回一個(gè)負(fù)值成功調(diào)用fork會(huì)創(chuàng)建一個(gè)新的進(jìn)程,它幾乎
    發(fā)表于 12-15 07:38

    hpmicro fork出來(lái)的riscv-gnu-toolchain與上游什么區(qū)別?

    找遍官網(wǎng)沒找到先關(guān)信息。幾個(gè)疑問 hpmicro fork出來(lái)的riscv-gnu-toolchain 與上游區(qū)別? 看到論壇里
    發(fā)表于 05-26 07:13

    Linux系統(tǒng)的fork運(yùn)行機(jī)制分析

    如果其中一個(gè)進(jìn)程的輸出結(jié)果是“pid1:1001, pid2:1002”,寫出其他進(jìn)程的輸出結(jié)果(不考慮進(jìn)程執(zhí)行順序)。 明顯這道題的目的是考察linux下fork的執(zhí)行機(jī)制。下面我們通過(guò)分析這個(gè)題目,談?wù)凩inux下fork的運(yùn)行機(jī)制。
    發(fā)表于 04-26 16:26 ?1166次閱讀
    Linux系統(tǒng)的<b class='flag-5'>fork</b>運(yùn)行機(jī)制分析

    Fork/Join框架的軟件重構(gòu)及性能分析

    針對(duì)目前對(duì)于Fork/Join框架應(yīng)用和性能分析的相關(guān)工作還不多的現(xiàn)狀,以JGF基準(zhǔn)測(cè)試程序套件為基礎(chǔ),對(duì)其中的senes、crypt、sparsematmult和sor等程序使用Fork/Join
    發(fā)表于 12-29 10:06 ?0次下載

    如何在GitHub上更新Fork以及PullRequest給源項(xiàng)目

    這里個(gè)小技巧:在默認(rèn)狀態(tài)下,會(huì)是Base源項(xiàng)目,Head我自己的Fork項(xiàng)目;這樣選擇任何一個(gè)時(shí),會(huì)調(diào)到某個(gè)無(wú)法更新的頁(yè)面;解決方法是先Base或Head一個(gè)其他人的賬號(hào)下的Fork,接著選擇
    的頭像 發(fā)表于 01-08 09:38 ?4374次閱讀
    如何在GitHub上更新<b class='flag-5'>Fork</b>以及PullRequest給源項(xiàng)目

    神奇的vfork

    ?什么是vfork,網(wǎng)絡(luò)上介紹它的文檔很多,隨便一搜就是一大堆。簡(jiǎn)單來(lái)說(shuō),vforkfork完成了基本上相同的功能,把進(jìn)程做了一次復(fù)制,變成兩個(gè)進(jìn)程。在shell中,執(zhí)行命令時(shí),shell程序就是通過(guò)“復(fù)制
    發(fā)表于 04-02 14:42 ?309次閱讀

    RTOS和 TSOS什么區(qū)別?

    RTOS和TSOS什么區(qū)別?
    的頭像 發(fā)表于 03-12 11:22 ?4579次閱讀

    fork函數(shù)的作用_fork函數(shù)創(chuàng)建進(jìn)程

     在Linux中fork函數(shù)是非常重要的函數(shù),它的作用是從已經(jīng)存在的進(jìn)程中創(chuàng)建一個(gè)子進(jìn)程,而原進(jìn)程稱為父進(jìn)程。
    發(fā)表于 12-01 13:41 ?7910次閱讀
    <b class='flag-5'>fork</b>函數(shù)的作用_<b class='flag-5'>fork</b>函數(shù)創(chuàng)建進(jìn)程

    基于Fork的功能性支架

    電子發(fā)燒友網(wǎng)站提供《基于Fork的功能性支架.zip》資料免費(fèi)下載
    發(fā)表于 11-18 12:09 ?0次下載
    基于<b class='flag-5'>Fork</b>的功能性支架

    SystemVerilog中的fork-join_any

    fork-join_any和fork-join有所不同,fork-join_any的父進(jìn)程一直阻塞,直到任何一個(gè)并行的子進(jìn)程結(jié)束。
    的頭像 發(fā)表于 12-09 09:05 ?2123次閱讀

    SystemVerilog中的fork-join

    fork-join語(yǔ)句塊中,每個(gè)語(yǔ)句都是并發(fā)進(jìn)程。在這個(gè)語(yǔ)句塊中,父進(jìn)程一直被阻塞,直到所有由“fork-join”產(chǎn)生的子進(jìn)程都執(zhí)行完。
    的頭像 發(fā)表于 12-09 11:58 ?2233次閱讀

    SystemVerilog中的fork-join_none

    fork-join_none和fork-join、fork-join_any的區(qū)別一樣在于進(jìn)程退出機(jī)制以及對(duì)于父進(jìn)程的影響。
    的頭像 發(fā)表于 12-12 10:00 ?2716次閱讀

    Linux中可怕的fork炸彈介紹

    Linux中的Fork炸彈(Fork Bomb)是一種拒絕服務(wù)攻擊的形式,它利用了操作系統(tǒng)中的“fork()”系統(tǒng)調(diào)用。
    的頭像 發(fā)表于 05-22 10:46 ?3024次閱讀
    Linux中可怕的<b class='flag-5'>fork</b>炸彈介紹

    fork()函數(shù)詳解

    pid_t fork(void);//pid_t為int類型,進(jìn)行了重載
    的頭像 發(fā)表于 08-15 09:41 ?1720次閱讀
    <b class='flag-5'>fork</b>()函數(shù)詳解