1. 程式人生 > >Linux系統fork函式介紹

Linux系統fork函式介紹

fork函式通過拷貝當前程序建立一個子程序。

在fork之前,我們先了解一些別的知識。傳統的fork系統呼叫直接把所有的資源複製給新建立的程序。這種實現過於簡單並且效率低下,因為它拷貝的資料也許並不共享,更糟的情況是,如果新程序打算立即執行一個新的映像,那麼所有的拷貝都將前功盡棄。Linux的fork使用寫時拷貝頁實現。

寫時拷貝:寫時拷貝是一種可以推遲甚至免除拷貝資料的技術。核心此時並不複製整個程序地址空間,而是讓父程序和子程序共享同一個拷貝。只有在需要寫入的時候,資料才會被複制,從而使各個程序擁有各自的拷貝。

fork函式:一個現有程序可以呼叫fork函式建立一個新程序

返回值:子程序中返回0,父程序中返回子程序ID,出錯返回-1

由fork建立的新程序被稱為子程序。fork函式被呼叫一次,但返回兩次。兩次返回的唯一區別是子程序的返回值為0,而父程序的返回值則是新子程序的程序ID。將子程序ID返回給父程序的理由是:因為一個程序的子程序可以有多個,並且沒有一個函式使一個程序可以獲得其所有子程序的程序ID。fork使子程序得到返回值0的理由是:一個程序只會有一個父程序,所以子程序總是可以呼叫getppid以獲得其父程序的程序ID。

我們使用一個程序演示

先宣告變數後父子程序都使用,可以成功就是因為寫時拷貝。

因為fork返回給父子程序的pid變數不同,所以可以通過pid的值來區分父子程序。父程序執行7次,子程序執行3次。

使用sleep讓程式沉睡一秒,體現父子程序的併發執行。