linux fork函數與vfork函數

一、fork
1. 調用方法
#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);
正確返回:在父進程中返回子進程的進程號,在子進程中返回0
錯誤返回:-1

     子進程是父進程的一個拷貝。即,子進程從父進程得到了數據段和堆棧段的拷貝,這些需要分配新的內存;而對於只讀的代碼段,通常使用共享內存的方式訪問。fork返回後,子進程和父進程都從調用fork函數返回處開始執行。
     父進程與子進程的不同之處在於:fork的返回值不同——父進程中的返回值爲子進程的進程號,而子進程爲0
2. fork函數調用的用途
⑴ 一個進程希望複製自身,從而父子進程能同時執行不同段的代碼。
⑵ 進程想執行另外一個程序


二、vfork
1. 調用方法
與fork函數完全相同
#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);
正確返回:在父進程中返回子進程的進程號,在子進程中返回0
錯誤返回:-1

2. vfork函數調用的用途
       用vfork創建的進程主要目的是用exec函數執行另外的程序,與fork的第二個用途相同

三、fork與vfork的區別
1. fork要拷貝父進程的數據段;而vfork則不需要完全拷貝父進程的數據段,在子進程沒有調用exec和exit之前,子進程與父進程共享數據段
2. fork不對父子進程的執行次序進行任何限制;而在vfork調用中,子進程先運行,父進程掛起,直到子進程調用了exec或exit之後,父子進程的執行次序纔不再有限制

四、結束子進程
     結束子進程不用exit(0),而使用_exit(0)。這是因爲_exit(0)在結束進程時,不對標準I/O流進行任何操作。而exit(0)則會關閉進程的所有標準I/O流。



轉自http://blog.csdn.net/lingdxuyan

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