Linux——創建進程1

創建進程

在Linux中創建進程的方式:

  1. 在shell中執行命令或者可執行文件
    — 由shell進程調用fork函數創建子進程
  2. 在代碼中(已經存在的進程中)調用fork函數創建子進程
    — 通過fork函數創建的進程爲已經存在進程的子進程

在Linux系統中進程0(PID = 0)使用內核創建,其他所有進程都有服進程調用fork函數所創建的
Linux系統中的進程0在創建子進程(PID=1, init進程),進程0就轉爲交換進程或者空閒進程。
進程1(init進程)是系統中所有其他進程的共同祖先。

函數原型:
頭文件:unistd.h
pid_t fork(void)
返回值:

  1. fork函數被正確調用後,將會在子進程中和父進程中分別返回!!!
    — 在子進程中返回值爲0(不合法的PID,提示當前運行在子進程中)
    — 在父進程中返回值爲子進程ID(讓父進程掌握所創建子進程的ID號)
  2. 出錯就返回-1

例子:
在這裏插入圖片描述
子進程的創建操作:
進程的資源其實包括內核空間資源和用戶空間資源;那麼我們創建子進程的操作其實就是分配內核空間資源和用戶空間資源。

簡單的來說,子進程是父進程的副本
— 子進程複製/拷貝父進程的PCB、數據空間(數據段、堆和棧)
— 父子進程共享正文段(只讀)
子進程和父進程繼續執行fork函數調用之後的代碼
爲了提高效率,fork後不併立即複製父進程數據段、堆和棧,採用了寫時複製機制(Copy-On-Write)
— 當父子進程任意之一要修改數據段、堆、棧時 ,進行復制操作,並且僅複製修改區域.

父子進程的不同:
在這裏插入圖片描述
父子進程對共享文件的常見的處理方式:
1. 父進程等待子進程完成;當子進程終止後,文件當前位置已經得到了相應的更新。
2. 父子進程各自執行不同的程序段,各自關閉不需要的文件。
3. 父進程希望複製自己(共享代碼,複製數據空間),但父子進程執行相同代碼中的不同分支。
— 比如網絡服務程序中,父進程等待客戶端的服務請求,當請求達到時,父進程調用fork創建子進程處理該請求,而父進程繼續等待下一個服務請求到達.
4. 父子進程執行不同的可執行文件(父子進程具有完全不同的代碼段額數據空間)
— 子進程從fork返回後,立即調用exec類函數執行另外一個可執行文件,




vfork函數:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章