fork函數和vfork()都可以用來創建進程
fork()一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為子進程(child process)。fork函數被調用一次但返回兩次。兩次返回的唯一區別是子進程中返回0值而父進程中返回子進程ID。子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味著父子進程間不共享這些存儲空間。
vfork()會產生一個新的子進程.但是vfork創建的子進程與父進程共享數據段(參考百度文庫,其實還共享了堆,運行結果表明),而且由vfork創建的子進程將先於父進程運行
示例一:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
int _num=8;
if ((pid = vfork()) < 0) { //創建子進程失敗
perror("vfork is failed");
exit(1);
} else if (pid == 0) { //運行時子進程
printf("this is child process\n");
_num++;
printf("the num is :%d\n",_num);
exit(0);
} else { // >0 vfork()返回值是子進程pid
printf("this is parent process\n");
_num++;
printf("the num is :%d\n",_num);
}
return 0;
}
運行結果:
第二個示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
int _num=8;
if ((pid = fork()) < 0) {
perror("fork is failed");
exit(1);
} else if (pid == 0) {
printf("this is child process\n");
_num++;
printf("the num is :%d\n",_num);
exit(0);
} else {
printf("this is parent process\n");
_num++;
printf("the num is :%d\n",_num);
}
return 0;
}
運行結果: