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;
}
我们可以看到子进程打印自己的pid和ppid后sleep了一秒,如果是
fork
则先打印父进程,而后才是子进程,但现在如果先打印子进程,子进程exit
后,再打印父进程则得以证明,vfork是子进程在父进程的地址空间里面运行。再来看一个例子
如果在定义一个全局变量g_value
然后在child里面将g_value赋值成100平打印其值和地址,最后在father中也做同样的事,我们看看会发生什么
结果是肯定的,打印的g_value是相同的,这就证明了用vfork使子进程在父进程的地址空间中运行。所以这里的子进程其实是一个线程
。
线程
:比进程的执行粒
度更细,线程是在进程内部运行的分支,一个进程可以有多个线程。在本例中这个子进程就相当于线程。