vfork函数也可以创建进程,与fork有什么区别
关键区别一:
vfork直接使用父进程存储空间,不拷贝
关键区别二:
vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行
一、fork:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid=fork();
if(pid>0)
{
while(1)
{
printf("this is father print,father pid=%d\n",getpid());
sleep(1);
}
}
else if(pid==0)
{
while(1)
{
printf("this is child print,child pid=%d\n",getpid());
sleep(1);
}
}
return 0;
}
运行结果:
fork:父子进程互相争夺CPU打印各自进程
二、vfork
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
int cnt=0;
pid=vfork();
if(pid>0)
{
while(1)
{
printf("this is father print,father pid=%d\n",getpid());
sleep(1);
}
}
else if(pid==0)
{
while(1)
{
printf("this is child print,child pid=%d\n",getpid());
sleep(1);
cnt++;
if(cnt==3)
{
break;
}
}
}
return 0;
}
vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行,如上程序,子进程打印三次之后,退出子进程,一直执行父进程。
三、子进程打印三次之后并打印次数的值,随后退出子进程,打印父进程。
#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("this is father print,father pid=%d\n",getpid());
sleep(1);
}
}
else if(pid==0)
{
while(1)
{
printf("this is child print,child pid=%d\n",getpid());
sleep(1);
cnt++;
if(cnt==3)
{
exit(0);
}
}
}
return 0;
}
vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。
——@上官可编程