
fork()
之后,父进程的虚拟地址空间拷贝给子进程:
- 子进程从fork()之后的语句开始执行
- 用户区:子进程的用户区数据与父进程一样
- 栈空间中 fork()返回的PID 子进程与父进程不同(父进程返回子进程PID,子进程返回0)
- fork之后父子进程中的数据不会相互影响
- 内核区:内核区也会发生拷贝,但其中子进程的PID与父进程不同
fork()通过写时拷贝实现
<aside>
💡 Linux 的 fork() 使用是通过写时拷贝 (copy- on-write) 实现。资源的复制在需要写入的时候才会进行,在此之前,只以只读方式共享
</aside>
写时拷贝:一种可以推迟甚至避免拷贝数据的技术
- 内核此时并不复制整个进程的地址空间,而是让父子进程共享同一个地址空间。
- 只用在需要写入的时候才会复制地址空间,从而使各个进程拥有各自的地址空间
- 注意:fork之后父子进程共享文件,fork产生的子进程与父进程相同的文件文件描述符指向相同的文件表,引用计数增加,共享文件偏移指针。