fork與vfork淺析

在Unix編程時,學習到了進程的建立的函數fork()與vfork()這兩個函數,所以做了一個總結:

1.fork()函數

      創建子進程,創建的子進程與父進程共享代碼段,但不共享數據段;在調用fork()函數後父子進程的運行順序不定,一個運行另個阻塞。其返回值有3種:

    a.創建出錯返回-1;

    b.創建正確,在子進程中返回0;在父進程中返回該子進程的PID。

代碼如下所示:

        

運行結果如下:

             

由程序和運行結果可得出如下結論:

    a.由上圖藍框可知,打印的順序不定,即在調用fork()函數後父子進程的運行順序不定;

    b.由a的值(紅線部分)可知,父子進程共享代碼段,但並沒有共享數據段;

   c..由上圖黃色部分可知,在父進程中pid=fork()函數返回值爲子進程的PID,而子進程中的pid值爲0;

    d.細心的話,可發現子進程的PID一直大於父進程的PID,原因是什麼呢,原因在與在調用fork()函數之前父進程   的PID已經存在,即父進程先於子進程創建,因此PID小於子進程。

2. vfork()函數

      個人認爲vfork()這個函數比較難理解。vfork()函數也是創建子進程,其主要目的是在於用exec函數執行另外的程序,在調用exec或exit之前子進程的運行中是與父進程共享數據段,但如果子進程修改了數據,而又沒有調用exec或exit,其結果是很糟糕的例如下面的代碼:  

           

其運行結果如下:

          

由程序和運行結果可得出如下結論:

    a. 由綠色的方框可知,子進程與父進程是即共享代碼段也共享數據段的

    b. 由紅色的圓框可知,在vfork()函數調用後,是先運行子進程後運行父進程

    c. 由藍色的線可知,vfork()函數返回的值,子進程爲0,父進程爲子進程的PID

倘若去掉子進程中的exit(0)(程序14行),會是什麼樣的一個結果呢?如下:

          


由程序和運行結果可得出如下結論:(程序一直運行直到子進程pid溢出才停止,即vfork()返回值pid=-1)

    a. 由藍線可知vfork()函數返回的值,子進程爲0,父進程爲子進程的PID

    b. 由紅框可知,在改程序運行時,由於整個進程一直在運行所以父進程的PID保持不變。

    c. 由紫色框可知,a的值無論在父進程還是子進程,其值都是不變的,

    d. 現在解釋一下,爲什麼程序最後vfork()函數會返回-1,其實是這個過程中是不斷的創建子進程的,所以子進程的pid一直在變化,直到所有的pid被用完,才停止程序,是不是很有意思呢。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章