区别一:
vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。
现在我们不调用exit来试试
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t pid;
pid = vfork();
if(pid > 0){
while(1){
printf("this is father print, pid = %d\n", getpid());
sleep(1);
}
}else if(pid == 0){
while(1){
printf("this is child print, pid = %d\n", getpid());
sleep(1);
}
}
return 0;
}

现在我们用break来退出子进程的while
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int cnt = 0;
pid_t pid;
pid = vfork();
if(pid > 0){
while(1){
printf("this is father print, pid = %d\n", getpid());
sleep(1);
}
}else if(pid == 0){
while(1){
printf("this is child print, pid = %d\n", getpid());
sleep(1);
cnt++;
if(cnt == 3){ // 执行3次退出子进程的while
break;
}
}
}
return 0;
}

区别二:
vfork直接使用父进程存储空间,不拷贝
现在我们在子进程中修改了cnt的值,在父进程中打印
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int cnt = 0;
pid_t pid;
pid = vfork();
if(pid > 0){
while(1){
printf("this is father print, pid = %d\n", getpid());
sleep(1);
printf("cnt = %d\n",cnt);
}
}else if(pid == 0){
while(1){
printf("this is child print, pid = %d\n", getpid());
sleep(1);
cnt++;
if(cnt == 3){
exit(0);
}
}
}
return 0;
}

现在就很明显看到它们的区别了,不拷贝,直接共享