vfork也可以创建进程,与fork有什么区别呢?
区别一:vfork可以直接使用父进程存储空间,不拷贝
区别二:vfork可以保证子进程先运行,当子进程调用exit退出后,父进程才执行
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
pid = fork();
if(pid>0)
{
while(1)
{
printf("parent process pid is %d\n",getpid());
sleep(1);
}
}
else if(pid == 0)
{
while(1)
{
printf("child process pid is %d\n",getpid());
sleep(1);
}
}
return 0;
}

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
pid = vfork();
if(pid>0)
{
while(1)
{
printf("parent process pid is %d\n",getpid());
sleep(1);
}
}
else if(pid == 0)
{
while(1)
{
cnt++;
printf("child process pid is %d\n",getpid());
sleep(1);
}
}
return 0;
}

原理:
-
fork 创造一个独立的子进程
-
父子谁先跑、谁后跑、谁跑得多,看系统调度
-
父子互不干扰,并行运行
-
vfork = 子进程先跑,父进程必须等子进程结束才能跑!
-
vfork 创建的子进程共享父进程地址空间
-
父进程会被阻塞,直到子进程退出或执行 exec
-
子进程不退出 → 父进程永远卡住!
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>int main()
{
pid_t pid;
int cnt = 0;
pid = vfork();
if(pid>0)
{
while(1)
{
printf("cnt = %d\n",cnt);
printf("parent process pid is %d\n",getpid());
sleep(1);
}
}
else if(pid == 0)
{
while(1)
{
cnt++;
printf("child process pid is %d\n",getpid());
sleep(1);
printf("cnt is %d\n",cnt);
if(cnt == 3)
{
break;
}
}
}return 0;}

子进程在break和return后结束了,父子共用的栈被销毁了,所以父进程打印的cnt的值是随机数
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid;
int cnt = 0;
pid = vfork();
if(pid>0)
{
while(1)
{
printf("cnt = %d\n",cnt);
printf("parent process pid is %d\n",getpid());
sleep(1);
}
}
else if(pid == 0)
{
while(1)
{
cnt++;
printf("child process pid is %d\n",getpid());
sleep(1);
printf("cnt is %d\n",cnt);
if(cnt == 3)
{
exit(0);
}
}
}
return 0;
}

子进程正常退出,不会破坏父子共享的栈结构,cnt = 3得以保留