相对于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函数族启动新的进程。
本文介绍了vfork函数的特点,包括其如何在不复制父进程地址空间的情况下创建子进程,以及这种特性带来的潜在问题如死锁。文章还提供了一个简单的示例程序来演示vfork的使用方法,并指出通常应在子进程中调用exec函数族。
2040

被折叠的 条评论
为什么被折叠?



