fork和vfork有什么區(qū)別,作為嵌入式工程師,這個肯定是要掌握的。
不管是fork還是vfork,他們都是為了創(chuàng)建子進程。
函數(shù)原型一樣,沒有參數(shù),但是返回值比較奇怪,別的函數(shù)都是只有一個返回值,但是fork和vfork有兩個。
#include就拿fork來說,程序剛運行的時候,只有一個父進程在運行,執(zhí)行了fork系統(tǒng)調(diào)用后,多了一個子進程,你可以理解成有兩個人在執(zhí)行這段代碼,父進程的fork返回子進程的ID,子進程的fork返回0,所以代碼運行的現(xiàn)象就是fork存在兩個返回值,if語句會進入兩個分支。#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和vfork的最大區(qū)別就是:fork產(chǎn)生的子進程會復(fù)制父進程的地址空間,在內(nèi)核的進程表中創(chuàng)建一個新的進程表項,新的進程表項有很多屬性和原進程一樣,像堆棧、數(shù)據(jù)段、文件描述符這些都會直接從父進程中繼承過來,而且兩個進程的代碼也一樣。
要說不一樣的地方,比如進程號、父進程號肯定不一樣。
那vfork有什么使用場景,如果fork產(chǎn)生子進程后,子進程立馬調(diào)用exec函數(shù)族啟動了一個新的進程,那么fork產(chǎn)生的地址空間必將浪費。
于是就有了vfork函數(shù),它最大的特點就是父子進程共享同一塊地址空間,這樣也不用給子進程分配資源,因為子進程接下來會被一個全新的進程替換。
除了共享資源上的區(qū)別,還有一些,比如fork產(chǎn)生的子進程和父進程的運行順序不一定,由系統(tǒng)決定,但是vfork產(chǎn)生的子進程一定比父進程先運行。
最后,再來看一下vfork的man手冊。

它提到了有些人認(rèn)為vfork是一種架構(gòu)缺陷,因為fork有了寫時拷貝機制,所以在有些場景下使用fork再去通過exec啟動新的進程也沒問題。
審核編輯:劉清
-
PID控制
+關(guān)注
關(guān)注
10文章
461瀏覽量
41258 -
printf函數(shù)
+關(guān)注
關(guān)注
0文章
31瀏覽量
6117 -
PID技術(shù)
+關(guān)注
關(guān)注
0文章
4瀏覽量
2037
原文標(biāo)題:fork和vfork的區(qū)別
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux下多進程編程之fork()函數(shù)語法
最常見的fork用法是什么
hpmicro fork出來的riscv-gnu-toolchain與上游有什么區(qū)別?
Linux系統(tǒng)的fork運行機制分析

Fork/Join框架的軟件重構(gòu)及性能分析
如何在GitHub上更新Fork以及PullRequest給源項目

神奇的vfork
fork函數(shù)的作用_fork函數(shù)創(chuàng)建進程

SystemVerilog中的fork-join_any
SystemVerilog中的fork-join
SystemVerilog中的fork-join_none
Linux中可怕的fork炸彈介紹

評論