fork()函數
在 Linux 中創建一個新進程的唯一方法是使用fork()函數。fork()函數是 Linux 系統中 一個非常重要的函數,和咱們以前遇到過的函數由一些區別,因為它看起來執行一次卻返回兩個值,這又作何 解釋?不著急,慢慢看。
函數說明
fork()函數用於從已存在的一個進程中創建一個新的進程 ,新進程稱為子進程,而原進程稱為父進程。使用fork()函數得到的子進程是父進程的一個復制品,它從父進 程處繼承了整個進程的地址空間,包括進程上下文、代碼段、進程堆棧、內存信息、打開的文件描述符、信號 控制設定、進程優先級、進程組號、當前工作目錄、根目錄、資源限制和控制終端等,而子進程所獨有的只有 它的進程號、資源使用和計時器等。
因為子進程幾乎是父進程的完全復制,所以父子進程會運行同一 個程序。這就需要用一種方式來區分它們,並使它們照此運行,否則,這兩個進程不可能做不同的事。
實際上是在父進程中執行fork()函數時,父進程會復制出一個子進程,而且父子進程的代碼從fork() 函數的返回開始分別在兩個地址空間中同時運行,從而使兩個進程分別獲得其所屬fork()函數的返回值,其中 在父進程中的返回值是子進程的進程號,而在子進程中返回0。因此,可以通過返回值來判定該進程是父進程 還是子進程。
同時可以看出,使用fork()函數的代價是很大的,它復制了父進程中的代碼段、數據段 和堆棧段裡的大部分內容,使得 fork()函數的系統開銷比較大,而且執行速度頁不是很快。
函數語法
下表列出了 fork() 函數的語法要點
基礎實驗
如下為fork()函數的基礎實驗程序
程序代碼我上傳到資源,可以自己下載,點此 下載
將它編寫成C文件,然後輸入命令:gcc fork.c -o fork
接著執行命令:./fork,就可以看到如下 圖的成功執行結果
當然,你也可以使用命令: arm-linux-gcc fork.c -o fork 交叉編譯後下載到板子上運行也可。