函數原型css
pid_t fork(void);
fork的奇異之處在於它被調用一次,卻返回兩次,它可能有三種不一樣的返回值:
一、在父進程中。fork返回新建立的子進程的PID
二、在子進程中,fork返回0。
三、假設出現錯誤,fork返回一個負值。html
用途:
一、一個進程但願複製自身。從而父子進程能同一時候運行不一樣段的代碼。linux
二、進程想運行另一個程序web
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t pid;
/*此時僅有一個進程*/
pid = fork();
/*此時已有兩個進程在同一時候運行*/
if( pid < 0)
printf("error in fork!\n");
else if(pid == 0)
printf("I am the child process, ID is %d\n",getpid());
else
printf("I am the parent process, ID is %d\n",getpid());
return 0;
}
在 pid = fork() 以前,僅僅有一個進程在運行,但在這條語句以後。就變成兩個進程在運行了,這兩個進程共享代碼段。將要運行的下一條語句就是 pid = fork() 以後的語句。兩個進程中,原來就存在的那個進程被稱做爲」父進程」,新出現的那個進程被做爲」子進程」,父子進程的差異在於進程標識符(PID)不一樣。
子進程的數據空間、堆棧空間都會從父進程獲得一個拷貝,而不是共享。shell
pid_t vfork(void);
一、在父進程中,fork返回新建立的子進程的PID
二、在子進程中。fork返回0。
三、假設出現錯誤,fork返回一個負值。數據庫
用途:
用vfork建立的進程主要目的是用exec函數族運行另外的程序,與fork的第二個用途一樣編程
fork 和 vfork 的差異
fork:子進程拷貝父進程的數據段。堆棧。
vfork:子進程與父進程共享數據段,堆棧。ubuntu
fork:父、子進程的運行次序不肯定
vfork:子進程先運行,父進程後運行緩存