vfork

vfork

fork后父进程和子进程通过自己的地址空间和页表看到自己的物理地址上的代码和数据,而vfork子进程和父进程共享一份地址空间结合页表映射到同物理内存上

如何证明

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main()
{
pid_t id = vfork();
if (0 == id){//child
printf("child: pid = %d, ppid = %d\n", getpid(), getppid());
sleep(1);
exit(1);
}else{//father
printf("father: pid = %d, ppid = %d\n", getpid(), getppid());
}
return 0;
}

1

我们可以看到子进程打印自己的pid和ppid后sleep了一秒,如果是fork则先打印父进程,而后才是子进程,但现在如果先打印子进程,子进程exit后,再打印父进程则得以证明,vfork是子进程在父进程的地址空间里面运行。

再来看一个例子 
如果在定义一个全局变量g_value然后在child里面将g_value赋值成100平打印其值和地址,最后在father中也做同样的事,我们看看会发生什么

g_value

结果是肯定的,打印的g_value是相同的,这就证明了用vfork使子进程在父进程的地址空间中运行。所以这里的子进程其实是一个线程。 
线程:比进程的执行度更细,线程是在进程内部运行的分支,一个进程可以有多个线程。在本例中这个子进程就相当于线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值