關於fork的詳細解釋


關於fork的詳細解釋

  fork是Linux中用來創建與父進程相同子進程的系統調用函數,他創建一個原有進程的精確副本,包括所有的文件描述符,寄存器等全部內容。在fork之后,原有的進程及其副本(父與子)就分開了。在fork時,所有的變量具有一樣的值,雖然父進程的數據被復制用以創建子進程,但是其中一個的后續變化並不會影響到另一個,兩個進程就是獨立個體,各自運行,互不干擾,父子進程誰先執行不由fork決定,而是由系統當前環境和進程調度算法決定,所以程序出來結果的順序是不確定的。

  子進程是從調用fork以后的代碼開始執行的,fork調用一次會返回兩個值,其中在子進程中返回0,在父進程中返回子進程的pid號

  下面給大家舉三個例子:

   程序一:

                       

  同學們,可以先根據程序,並依據我上面所說的知識點,猜測一下運行結果

  最后運行的結果是:

                      

  我們可以看到程序既輸出了world,又輸出了hello,而其中world和hello分別是同一個if函數中if和else中的值,不可能同時打出,那現在竟然出現了這樣的結果,是什么原因呢?

  其實,正如我們上面所說,子進程是從調用fork以后的代碼開始執行的,fork調用一次會返回兩個值,其中在子進程中返回0,在父進程中返回子進程的pid號,父進程中的返回值是非0值,因此父進程打出world,而子進程中因為返回值是0,因此打出hello,所以既打出了world又打出了hello,但調用fork結束以后,兩個進程就是獨立個體,各自運行,互不干擾父子進程誰先執行不由fork決定,而是由系統當前環境和進程調度算法決定,因此根據個人系統情況不同,打出world和hello的順序不一定一致,我們只能確定運行出來的結果,但沒辦法確定運行結果出來的順序。

程序二:

                         

運行結果:

                        

  這個程序,比上面的程序復雜一些,因此,我給大家畫圖進行講解。

 因此,結果是“A”,“B”,“B”。

程序三:

                       

運行過程:

                      

  這個過程也較為復雜,我也畫圖解釋。

 

它的結果是BBABAA,順序不能確定,因為這是根據系統當前環境和進程調度算法決定。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM