相对于fork,vfork在创建线程时不会将父进程的地址空间完全拷贝过来,相反是在父进程的地址空间里运行的,因此对父进程变量的修改会在父进程体现出来。
另外vfork可以保证子进程先于父进程执行,此时如果子进程依赖父进程的某些条件可能会产生死锁。
函数原型
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void)
返回值:
子进程返回0,父进程返回子进程pid,出错返回-1。
简单例子:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
extern int errno;
int main(void)
{
pid_t pid;
int val = 100;
if((pid = vfork()) < 0)
{
printf("vfork error %s\n", strerror(errno));
exit(-1);
}
else if(pid == 0)
{
val += 100;
}
printf("(%d)value of val after child process changed is %d\n", getpid(), val);
exit(0);
}
使用场景:
在调用vfork之后应该在子进程中调用exec函数族启动新的进程。