vfork和fork
fork()函数是拷贝一个父进程的副本,拥有独立的代码段 数据段 堆栈空间 然而vfork是共享父亲进程的代码以及代码段
vfork是可以根据需要复制父进程空间,这样很大程度的提高勒性能。
1 例子vfork检测 子进程和父进程值是否一样
1 #include <sys/types.h> 2 #include <stdio.h> 3 #include <unistd.h> 4 #include <error.h> 5 #include <fcntl.h> 6 #include <string.h> 7 #include <stdlib.h> 8 9 int glob = 8;//全局已经初始化的变量 位于数据段 10 int main() 11 { 12 int var; 13 pid_t pid; 14 var = 99; 15 printf("最开始的glob=%d var=%d ",glob,var);//输出初始的值 16 if((pid=vfork())<0) 17 { 18 perror("vfork"); 19 exit(EXIT_FAILURE); 20 }else if(pid==0) 21 { 22 printf("在子进程中,修改后的glob和var为 "); 23 glob++;//子进程修改全局变量 24 var++;//子进程修改局部变量 25 printf("在子进程中 glob=%d var=%d ",glob,var); 26 _exit(0); 27 }else//父进程打印 28 { 29 printf("在父进程中 glob=%d var=%d ",glob,var); 30 return 0; 31 } 32 return 1; 33 }
结果发现:子进程和父进程共享数据空间
2 当把上面的代码vfork改变为fork后的执行结果如下:
结果发现:fork函数创建子进程时候 子进程是父进程的一份拷贝