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。
相關文章
- Linux程式建立函式vfork簡介Linux函式
- vfork()函式函式
- fork函式與vfork函式函式
- fork()與vfork()函式函式
- fork與vfork函式函式
- vfork函式例項函式
- fork 和 vfork 使用的注意事項和 system() 函式的替代函式
- 建立函式函式
- sql 函式實現三種父子遞迴SQL函式遞迴
- 程式中fork和vfork的區別
- 建立函式失敗函式
- 【微信小程式】正確建立 [雲函式] [login] 的方法微信小程式函式
- 程式——父子程式共享
- javascript建立安全的建構函式JavaScript函式
- 建立一個字串分割的函式字串函式
- 如何讀懂並寫出裝逼的函式式程式碼函式
- 《機器學習實戰》程式清單3-4 建立樹的函式程式碼機器學習函式
- 建構函式建立物件函式物件
- shell高階-----建立函式函式
- MySQL建立自定義函式MySql函式
- 利用回撥函式和CSocket建立網路程式 (轉)函式
- Elm 0.14 釋出,函式式反應式程式語言函式
- JS中建立函式的幾種方式JS函式
- Hive--->建立自定義的UDTF函式Hive函式
- php建立多層目錄的函式PHP函式
- 用前面建立的函式獲取物件函式物件
- 測試建立基於函式的索引函式索引
- Linux vfork()Linux
- 程式函式函式
- Python(2):建立函式模組Python函式
- kingbase——建立truncate函式函式
- 程式碼的藝術:如何寫出小而清晰的函式函式
- 從建立程式到進入main函式,發生了什麼?AI函式
- ncurses輸出函式:字元+字串的輸出函式字元字串
- Vue父子元件生命週期執行順序及鉤子函式的個人理解Vue元件函式
- 私有建構函式的物件建立例項函式物件
- Golang建立建構函式的方法詳解Golang函式
- jQuery函式的等價原生函式程式碼示例jQuery函式