linux中fork()與vfork()的區別

期待一片自己的藍天發表於2014-07-24

一、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流。

相關文章