fork是在父进程中开辟一份子进程的虚拟空间,其子进程复制了父进程的资源,也包括内存的task_struct。
fork代码如下:
fork运行结果如下:
从运行结果里面可以看出父子两个进程的pid不同,堆栈和数据资源都是完全的复制,子进程改变了count的值,而父进程中的count没有被改变。子进程与父进程count的地址(虚拟地址)是相同的(注意他们在内核中被映射的物理地址不同)
先前我们知道fork是在父进程中开辟一份子进程的虚拟4G空间,而vfork却不创建子进程的虚拟空间了,而是直接和父进程共享一片虚拟空间,当然也间接共享了父进程的物理空间了。
vfovk代码如下:
vfork 运行结果如下:
从运行结果可以看到vfork创建出的子进程(线程)共享了父进程的count变量,2者的count指向了同一个内存,所以子进程修改了count变量,父进程的 count变量同样受到了影响。