fork和vfork有什么區別,作為嵌入式工程師,這個肯定是要掌握的。
不管是fork還是vfork,他們都是為了創建子進程。
函數原型一樣,沒有參數,但是返回值比較奇怪,別的函數都是只有一個返回值,但是fork和vfork有兩個。
#include就拿fork來說,程序剛運行的時候,只有一個父進程在運行,執行了fork系統調用后,多了一個子進程,你可以理解成有兩個人在執行這段代碼,父進程的fork返回子進程的ID,子進程的fork返回0,所以代碼運行的現象就是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的最大區別就是:fork產生的子進程會復制父進程的地址空間,在內核的進程表中創建一個新的進程表項,新的進程表項有很多屬性和原進程一樣,像堆棧、數據段、文件描述符這些都會直接從父進程中繼承過來,而且兩個進程的代碼也一樣。
要說不一樣的地方,比如進程號、父進程號肯定不一樣。
那vfork有什么使用場景,如果fork產生子進程后,子進程立馬調用exec函數族啟動了一個新的進程,那么fork產生的地址空間必將浪費。
于是就有了vfork函數,它最大的特點就是父子進程共享同一塊地址空間,這樣也不用給子進程分配資源,因為子進程接下來會被一個全新的進程替換。
除了共享資源上的區別,還有一些,比如fork產生的子進程和父進程的運行順序不一定,由系統決定,但是vfork產生的子進程一定比父進程先運行。
最后,再來看一下vfork的man手冊。
它提到了有些人認為vfork是一種架構缺陷,因為fork有了寫時拷貝機制,所以在有些場景下使用fork再去通過exec啟動新的進程也沒問題。
審核編輯:劉清
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
PID控制
+關注
關注
10文章
460瀏覽量
40274 -
printf函數
+關注
關注
0文章
31瀏覽量
5921 -
PID技術
+關注
關注
0文章
4瀏覽量
1987
原文標題:fork和vfork的區別
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Linux下多進程編程之fork()函數語法
,因此執行速度是比較慢的。為了加快fork()的執行速度,很多UNIX系統設計者創建了vfork()。vfork()也能創建新進程,但它不產生父進程的副本。它是通過允許父子進程可訪問相同物理內存,從而偽裝
發表于 08-19 09:28
最常見的fork用法是什么
接口語法用來創造一個子進程在子進程中,成功的fork調用會返回 0。在父進程中fork返回子進程的 pid。如果出現錯誤,fork返回一個負值成功調用fork會創建一個新的進程,它幾乎
發表于 12-15 07:38
hpmicro fork出來的riscv-gnu-toolchain與上游有什么區別?
找遍官網沒找到先關信息。有幾個疑問
hpmicro fork出來的riscv-gnu-toolchain 與上游有何區別?
看到論壇里有文
發表于 05-26 07:13
Linux系統的fork運行機制分析
如果其中一個進程的輸出結果是“pid1:1001, pid2:1002”,寫出其他進程的輸出結果(不考慮進程執行順序)。
明顯這道題的目的是考察linux下fork的執行機制。下面我們通過分析這個題目,談談Linux下fork的運行機制。
發表于 04-26 16:26
?1189次閱讀
Fork/Join框架的軟件重構及性能分析
針對目前對于Fork/Join框架應用和性能分析的相關工作還不多的現狀,以JGF基準測試程序套件為基礎,對其中的senes、crypt、sparsematmult和sor等程序使用Fork/Join
發表于 12-29 10:06
?0次下載
如何在GitHub上更新Fork以及PullRequest給源項目
這里有個小技巧:在默認狀態下,會是Base源項目,Head我自己的Fork項目;這樣選擇任何一個時,會調到某個無法更新的頁面;解決方法是先Base或Head一個其他人的賬號下的Fork,接著選擇
神奇的vfork
?什么是vfork,網絡上介紹它的文檔很多,隨便一搜就是一大堆。簡單來說,vfork和fork完成了基本上相同的功能,把進程做了一次復制,變成兩個進程。在shell中,執行命令時,shell程序就是通過“復制
發表于 04-02 14:42
?313次閱讀
fork函數的作用_fork函數創建進程
在Linux中fork函數是非常重要的函數,它的作用是從已經存在的進程中創建一個子進程,而原進程稱為父進程。
發表于 12-01 13:41
?7967次閱讀
SystemVerilog中的fork-join_any
fork-join_any和fork-join有所不同,fork-join_any的父進程一直阻塞,直到任何一個并行的子進程結束。
SystemVerilog中的fork-join
在fork-join語句塊中,每個語句都是并發進程。在這個語句塊中,父進程一直被阻塞,直到所有由“fork-join”產生的子進程都執行完。
SystemVerilog中的fork-join_none
fork-join_none和fork-join、fork-join_any的區別一樣在于進程退出機制以及對于父進程的影響。
評論