關於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,順序不能確定,因為這是根據系統當前環境和進程調度算法決定。