建立新程序 fork函式

2021-08-03 07:05:54 字數 1629 閱讀 5552

fork函式原型

#includepid_t fork(void);
關於fork的了解

乙個現有的程序可以呼叫fork函式建立乙個新的程序。由fork建立的新程序被稱為子程序。

關於fork的返回值

fork函式被呼叫一次,但是它的返回值有兩個。子程序的返回值為0,父程序的返回值則是新建立的子程序的id。

fork函式建立子程序之後

父子程序繼續執行fork呼叫之後的指令。子程序是父程序的副本。例如,子程序獲得父程序的資料空間,堆和棧的副本。注意,這是子程序所擁有的副本。父程序和子程序並不共享這些儲存空間的部分。父子程序共享的是正文段。

關於寫時複製技術

fork函式建立出子程序以後,經常跟著exec,所以現在很多實現並不執行乙個父程序資料段、棧和堆的完全副本。作為替代,使用了寫時複製的技術。這些區域由父程序和子程序共享,而且核心將他們的訪問許可權改變成唯讀許可權。如果父子程序中其中乙個試圖修改這些區域,則核心只為修改區域的這塊記憶體製作乙個副本,通常是虛擬儲存系統中的一頁。

子程序對變數所做的改變並不影響父程序中該變數的值

fork函式之後先執行父程序還是子程序

在fork函式之後先執行父程序還是子程序是不確定的,這是取決於核心所使用的排程演算法。如果要求父程序和子程序之前相互同步,則要求某種形式的程序間通訊。

檔案共享

在重定向父程序的標準輸出時,子程序的標準輸出也被重定向。實際上,fork的乙個特性是父程序的的所有開啟檔案描述符都被複製到子程序。我們說「複製」是因為對每個檔案描述符來說,就好像執行了dup函式。重要的一點是,父程序和子程序共享同乙個檔案偏移量。如果父程序的標準輸出已重定向,那麼子程序寫到標準輸出時,它將更新與父程序共享的該檔案的偏移量。

fork之後檔案描述符有一下兩種常見的情況

(1)父程序等待子程序完成。父程序無需對其描述符做任何處理

(2)父程序和子程序各自執行不同的程式段。父子程序各自關閉他們不需使用的檔案描述符,不干擾對方使用的檔案描述符。

fork失敗的兩個主要的原因

(1)系統中已經有了太多的程序

(2)該實際使用者id的程序總數超過了系統限制

fork的兩種用法

(1)乙個父程序希望複製自己,使父程序和子程序同時執行不同的**段。這在網路服務程序中是常見的——父程序等待客戶端的服務請求,子程序處理此請求。父程序繼續等待下乙個服務請求

(2)乙個程序要執行乙個不同的程式,子程序從fork返回後立即呼叫exec

fork和vfork的區別

(1)fork和vfork一樣都是建立乙個子程序,但是它並不將父程序的位址空間完全複製到子程序中,因為子程序會立即呼叫exec(或exit),於是也就不會引用該位址空間,不過在子程序呼叫exec(或exit)之前,他在父程序的空間中執行。

(2)vfork保證子程序先執行,在它呼叫exec(或exit)之後,父程序才可能被排程執行,當子程序呼叫這兩個函式(exec或exit)中的任意乙個時,父程序會恢復執行。(如果在呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會導致死鎖)。因為我們可以保證在子程序呼叫exec或exit之前,核心會使父程序處於休眠狀態。

建立程序 fork函式

最近,我在linux中學到了乙個神奇的函式,名為fork 函式,它的作用是建立程序。它的神奇之處在於呼叫fork 函式時,系統會建立乙個與原來程序幾乎完全相同的程序,大致的意思就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事 就相當於是轉殖了乙個自己。先來看...

程序建立函式fork

函式原型 pid t fork void 標頭檔案 include 函式功能 建立乙個子程序 返回值 1.1 建立失敗 2.0 返回的是子程序 3.0 返回的是父程序,返回值是子程序 id函式特性 1.呼叫一次,會有兩個返回值 2.先返回哪個值,不確定,一般先返回父程序 3.使用者可以通過延時函式,...

建立程序庫函式fork

unix作業系統提供了庫函式fork來建立乙個新的程序,本文分析一下fork呼叫背後發生了什麼。例如 int pid fork 從fork函式返回,父程序 pid 0 和子程序 pid 0 擁有相同的user leverl context 包括data,text以及stack 的拷貝。fork函式的...