父子进程间文件共享

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

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

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

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

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

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

这里写图片描述

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

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

这里写图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值