(1) 先看一個實例:
#include <unistd.h>;
#include <sys/types.h>;
main ()
{
pid_t pid;
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %dn",getpid());
else
printf("i am the parent process, my process id is %dn",getpid());
}
結果是
[root@localhost c]# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285
為什么兩行都打印出來了?在我想來,無論pid是多少,都應該僅僅有一行才對。原因在於fork之后,操作系統會復制一個與父進程全然同樣的子進程,雖說是父子關系,可是在操作系統看來,他們更像兄弟關系,這2個進程共享代碼空間,可是數據空間是互相獨立的,子進程數據空間中的內容是父進程的完整拷貝,指令指針也全然同樣,但僅僅有一點不同,假設fork成功,子進程中fork的返回值是0,父進程中fork的返回值是子進程的進程號,假設fork不成功,父進程會返回錯誤。能夠這樣想象,2個進程一直同一時候執行,並且步調一致,在fork之后,他們分別作不同的工作,也就是分岔了。這也是fork為什么叫fork的原因。
勘誤:子進程的pid是0,子進程的getpid()是它自己的進程號;父進程中的pid值為子進程進程號,僅僅有父進程執行的getpid()才是他自己的進程號。
(2)函數原型例如以下:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
正確返回:在父進程中返回子進程的進程號,在子進程中返回0。功能:子進程是父進程的一個拷貝。即,子進程從父進程得到了數據段和堆棧段的拷貝,這些須要分配新的內存;而對於僅僅讀的代碼段,通常使用共享內存的方式訪問。fork返回后,子進程和父進程都從調用fork函數的下一條語句開始運行。
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);
正確返回:在父進程中返回子進程的進程號,在子進程中返回0
(3)fork與vfork的差別
1. fork要拷貝父進程的數據段;而vfork則不須要全然拷貝父進程的數據段,在子進程沒有調用exec和exit之前,子進程與父進程共享數據段
2. fork不正確父子進程的運行次序進行不論什么限制;而在vfork調用中,子進程先運行,父進程掛起,直到子進程調用了exec或exit之后,父子進程的運行次序才不再有限制。
參考原文:http://blog.csdn.net/yanh_lzu/archive/2008/04/21/2311644.aspx