建立程序 fork函式

2021-08-08 04:39:46 字數 1549 閱讀 9573

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

先來看乙個例子

#include #include #include #include #include #include int main()

else

}

大家一定都很好奇結果是什麼?那麼結果到底是什麼呢?

執行結果是 

world

hello

在語句res=fork()之前,只有乙個程序在執行這段**,但是在這條語句之後,就變成兩個程序在執行了,這兩個程序幾乎完全相同,將要執行的下一條語句都是if(res<0),為什麼兩個程序執行的結果會不同呢?這與fork函式的特性有關。

fork函式的神奇之處就在於它僅僅被呼叫一次,卻能夠返回兩次,它有三種不用的返回值

1)、在新建立的程序即子程序中返回0

2)、在呼叫fork函式的程序即父程序中返回新建立程序的id

3)、如果出現錯誤,fork函式返回乙個負值

在fork函式執行完畢後,如果建立程序成功,則出現兩個程序,乙個父程序和乙個子程序。在子程序中,fork函式返回0。在父程序中,fork函式返回子程序的程序號。因此,我們就可以通過fork的返回值來判斷當前程序是父程序還是子程序。

父程序和子程序都是從fork函式之後的**開始執行,那麼在條件之外的語句又該如何執行呢?

int main()

if(res==0)

else

父子程序都執行

下面請看第二個例子 

#include #include #include #include #include #include int main()

else

printf("你好,中國");

}

根據上面介紹的父程序與子程序的執行順序,結果是 :

中國          

你好,中國

你好你好,中國

之前的例子只是簡單的練手,現在重點來了,請看第三個例子 

#include #include #include #include #include #include int main()

else}}

這個例子較之前的兩個更加複雜一點,那麼這個結果是什麼呢?請看下**析過程

如上圖所示,結果為三個a三個b(與順序無關)。當i=0時,第乙個程序建立乙個新程序,即黑色箭頭產生,結果為黑色字母。當i=1時,第一次建立的兩個程序分別建立乙個程序,為圖中紅色箭頭,結果為紅色結果。至於兩個程序誰先建立程序,暫不研究。

本次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函式的...

建立程序庫函式fork

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