fork和vfork有什么區(qū)別,作為嵌入式工程師,這個(gè)肯定是要掌握的。
不管是fork還是vfork,他們都是為了創(chuàng)建子進(jìn)程。
函數(shù)原型一樣,沒有參數(shù),但是返回值比較奇怪,別的函數(shù)都是只有一個(gè)返回值,但是fork和vfork有兩個(gè)。
#include就拿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è)分支。#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)生的子進(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è)。
它提到了有些人認(rèn)為vfork是一種架構(gòu)缺陷,因?yàn)閒ork有了寫時(shí)拷貝機(jī)制,所以在有些場(chǎng)景下使用fork再去通過(guò)exec啟動(dòng)新的進(jìn)程也沒問題。
審核編輯:劉清
-
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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論