vfork与fork的区别
区别:vfork直接使用父进程的存储空间,不进行拷贝;vfork保证子进程先运行,直到子进程调用exit退出后,父进程才执行。
简单的代码实现一下
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
int i;
pid=vfork();
if(pid > 0){//父进程
while(1){
printf("这是父进程,pid=%d\n",getpid());
sleep(2);//防止刷屏
}
}else if(pid == 0){//子进程
for(i=0;i<5;i++){//看看是不是保证子进程先运行,五次过后推出进入父进程
printf("这是子进程,pid=%d,这是第%d次\n",getpid(),i+1);
sleep(1);//防止刷屏
}
exit(-1);
}
return 0;
}
结果
如果是fork()
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
int i;
pid=fork();
if(pid > 0){//父进程
while(1){
printf("这是父进程,pid=%d\n",getpid());
sleep(2);//防止刷屏
}
}else if(pid == 0){//子进程
for(i=0;i<5;i++){//看看是不是保证子进程先运行,五次过后推出进入父进程
printf("这是子进程,pid=%d,这是第%d次\n",getpid(),i+1);
sleep(1);//防止刷屏
}
exit(-1);
}
return 0;
}
结果
可以看出vfork()是可以保证子进程先运行
修改一下
定义一个变量,看看变量在父进程输出的时候会不会之前受到子进程影响
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
int i;
int cnt=0;
pid=vfork();
if(pid > 0){//父进程
while(1){
printf("这是父进程,pid=%d\n",getpid());
printf("cnt=%d\n",cnt);
sleep(2);//防止刷屏
}
}else if(pid == 0){//子进程
for(i=0;i<5;i++){//看看是不是保证子进程先运行,五次过后推出进入父进程
printf("这是子进程,pid=%d,这是第%d次\n",getpid(),i+1);
cnt++;
sleep(1);//防止刷屏
}
exit(-1);
}
return 0;
}
结果
对比一下fork();
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
int i;
int cnt=0;
pid=fork();
if(pid > 0){//父进程
while(1){
printf("这是父进程,pid=%d\n",getpid());
printf("cnt=%d\n",cnt);
sleep(2);//防止刷屏
}
}else if(pid == 0){//子进程
for(i=0;i<5;i++){//看看是不是保证子进程先运行,五次过后推出进入父进程
printf("这是子进程,pid=%d,这是第%d次\n",getpid(),i+1);
cnt++;
sleep(1);//防止刷屏
}
exit(-1);
}
return 0;
}
结果
说明用vfork,之前定义的变量会受到子进程的影响,因为子进程没有拷贝父进程的存储空间二十直接使用了父进程的存储空间