vfork函式建立出的父子程式
vfork函式建立新程式的主要目的在於用exec函式執行另外的程式。在沒呼叫exec或exit之前子程式的執行中是與父程式共享資料段的,在vfork呼叫中,子程式先執行,父程式掛起,直到子程式呼叫exec或exit,在這之後,父子程式的執行順序不在有限制。
例:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5
6 int main()
7 {
8 int g_val = 100;
9 pid_t id = vfork();
10 if(id == 0)
11 {
12 g_val++;
13 printf("child,running first...%d:%p\n",g_val,&g_val);
14 sleep(1);
15 //exit(0);
16
17 }
18 else
19 {
20 printf("father,running second...%d:%p\n",g_val,&g_val);
21 }
22 return 0;
23 }
在執行這個程式之後,會發生什麼情況呢?執行結果如下:
在列印了第一行child,running first之後,每隔一秒列印兩行father...和child...。
這是由於在子程式呼叫exec或exit之前,在父程式空間中執行,也就是說會更改父程式的資料段,棧和堆。每個程式在核心中都有一個程式控制塊(PCB)來維護程式相關的資訊。子程式在執行sleep(1)時,更改了父程式中程式控制塊的程式計數器,程式中將被執行下一條指令的地址被修改為子程式的地址,所以在父程式結束後又執行了子程式。如此迴圈往復就得到了我們看到的情況。
若在原始檔中加上exit(0),結果如何?
在列印child...之後一秒列印father...程式執行結束。由於子程式在sleep(1)後退出,那麼父程式結束後程式結束。
總結:
1:vfork保證子程式先執行,在它呼叫exec或者exit後父程式才被排程執行;
2:在子程式呼叫exec或exit之前,在父程式空間中執行,會改變父程式的pcb。
相關文章
- fork()與vfork()函式函式
- 程式中fork和vfork的區別
- Linux vfork()Linux
- 【微信小程式】正確建立 [雲函式] [login] 的方法微信小程式函式
- kingbase——建立truncate函式函式
- 程式——父子程式共享
- 建構函式建立物件函式物件
- shell高階-----建立函式函式
- JS中建立函式的幾種方式JS函式
- Hive--->建立自定義的UDTF函式Hive函式
- 從建立程式到進入main函式,發生了什麼?AI函式
- 由函式的解析式給出函式的性質 | 你想到了嗎函式
- 私有建構函式的物件建立例項函式物件
- python例項建立銷燬的函式整理Python函式
- Golang建立建構函式的方法詳解Golang函式
- 建構函式方式建立正規表示式函式
- ncurses輸出函式:字元+字串的輸出函式字元字串
- 分享常用的CSS函式,助你寫出更簡潔的程式碼CSS函式
- 20201023_081.遞迴函式_函式呼叫記憶體分析_棧幀的建立遞迴函式記憶體
- matlab自定義函式建立與使用Matlab函式
- 程式中的函式引數函式
- jquery繫結未來新建立函式的方法onjQuery函式
- 使用函式式語言來建立領域模型函式模型
- Vue父子元件生命週期執行順序及鉤子函式的個人理解Vue元件函式
- 2.3.5 隱式建立的應用程式
- python函式程式設計 返回函式 匿名函式 裝飾器 偏函式Python函式程式設計
- CityEngine函式庫1-幾何建立函式
- 函式程式設計函式程式設計
- uniapp——元件的建立使用和元件的生命週期函式APP元件函式
- MySQL建立隨機生成電話的儲存函式MySql隨機儲存函式
- 執行緒建立的函式及應用小結執行緒函式
- 工廠模式建立物件和自定義建構函式建立物件的異同模式物件函式
- SAP物料主資料建立時間和建立個數的函式關係函式
- SD--根據訂單建立出庫單(相關的函式列表的介紹系列篇(2))函式
- python使用魔法函式建立可切片型別Python函式型別
- main函式的入口函式AI函式
- Python函數語言程式設計-高階函式、匿名函式、裝飾器、偏函式Python函數程式設計函式
- C++逐字輸出函式C++函式
- 2.2 畫出函式圖形函式