父子进程间文件共享

fork函数调用一次,返回两次。在新创建的过程中返回一次,返回值为0.在原来的进程中返回一次,返回值是新进程的pid。 
通过fork函数创建的进程为新进程的父进程。即就是,通过fork创建的进程与原进程是父子关系。

孤儿进程:当父进程结束以后,子进程未结束,子进程的父进程变为init。init这个进程是守护进程,它负责处理这些孤儿进程退出以后的一些状态。 
僵死进程:(1)父进程未结束,子进程结束,父进程未获取子进程的退出数据,此时子进程成为僵死进程。 
(2)进程主体已经释放,PCB还在。

fork之后,父子进程间数据不共享,包括全局数据、栈区数据以及堆区数据。

fork之后,父子进程间文件描述符和文件偏移量是共享的。

子进程是父进程的一个拷贝,子进程从父进程那里得到了数据段和堆栈段,子进程与父进程单独分配内存。fork函数返回后,子进程和父进程都是从fork函数的下一条语句开始执行。由于子进程与父进程的运行无关,所以父子进程谁先运行不一定。

子进程可以使用fork之前open返回的文件描述符。因为调用fork之后,只拷贝了PCB本身,拷贝的只是指针,没有拷贝指针所指向的内容,这种情况叫做浅拷贝。子进程的指针依旧指向struct file,所以父子进程对于文件描述符和文件偏移量是共享的。

这里写图片描述

fork之后,父子进程之间数据并不共享。

写时拷贝技术: 
fork产生子进程后,并不会将父进程(代码、栈区、堆区、全局变量)拷贝一份,内核将这些区域设置为只读,当父子进程中任意一个试图修改数据时,才会将修改数据所在的页拷贝一份。 
如果不修改父进程或子进程,则父子共用一块物理内存,所以说在修改前内存一直是共享的,并没有拷贝。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/iot_shun/article/details/80923596