fork與vfork的區別
1.vfork保證子進程先運行,在它調用exec或exit之后父進程才可能被調度運行。如果在調用這兩個函數之前子進程依賴于父進程的進一步動作,則會導致死鎖。
2.fork要拷貝父進程的進程環境;而vfork則不需要完全拷貝父進程的進程環境,在子進程沒有調用exec和exit之前,子進程與父進程共享進程環境,相當于線程的概念,此時父進程阻塞等待。
為什么會有vfork呢?
因為以前的fork當它創建一個子進程時,將會創建一個新的地址空間,并且拷貝父進程的資源,然后將會有兩種行為:
1.執行從父進程那里拷貝過來的代碼段
2.調用一個exec執行一個新的代碼段
當進程調用exec函數時,一個新程序替換了當前進程的正文,數據,堆和棧段。這樣,前面的拷貝工作就是白費力氣了,這種情況下,聰明的人就想出了vfork。vfork并不復制父進程的進程環境,子進程在父進程的地址空間中運行,所以子進程不能進行寫操作,并且在兒子“霸占”著老子的房子時候,要委屈老子一下了,讓他在外面歇著(阻塞),一旦兒子執行了exec或者exit后,相當于兒子買了自己的房子了,這時候就相當于分家了。
因此,如果創建子進程是為了調用exec執行一個新的程序的時候,就應該使用vfork
之后我會更新 fork 和 vfork 的具體用法。