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