【Linux】写实拷贝、父子进程间数据共享以及僵死进程

本文详细介绍了Linux中父子进程间的数据共享机制,包括写实拷贝的概念,以及如何处理僵死进程。在写实拷贝中,父子进程共享数据空间,只有在修改时才会复制。父子进程共享全局、局部、堆区数据和文件描述符。处理僵死进程通常通过wait或waitpid函数获取子进程的退出码,或者设置信号处理函数响应SIGCHLD信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、写实拷贝

二、父子进程间数据共享

三、僵死进程


我们都知道fork之后,会产生子进程,那么今天就来看一下,产生的子进程与父进程之间的数据共享问题。要说这个我们必须明确写实拷贝的概念

一、写实拷贝

fork之后,子进程会拷贝父进程的PCB结构(这个拷贝是浅拷贝),然后对PCB里的数据做修改(pid,ppid等属性信息,也有保留的一些不做修改的)。我们现在假设一种情况,若fork之后,刚开始时就把父进程的所有页表直接拷贝给子进程,但子进程中并没有访问或修改这些页表,就要进程替换,岂不是白白做了一次复制(复制没有意义),所以,出现了写实拷贝技术,这样在刚开始时子进程并不是真正的复制父进程的空间,而是与父子进程共享所有的数据空间(全局、局部、堆区数据)。当父、子进程中任意一个进程试图去修改数据时,操作系统会将要修改的数据所在的页直接复制出来。可见写实拷贝技术是一种较高效的拷贝技术,省去了很多不必要的拷贝过程。

在这里,再提一下深拷贝和浅拷贝,二者仅在拷贝指针时存在区别

浅拷贝:只拷贝指针的值,而不拷贝指针所指向空间的内容

深拷贝:拷贝指针的值,同时也会将指针指向的内容拷贝一份

如图所示:

二、父子进程间数据共享

父子进程间对于全局数据、局部数据、堆区数据、文件描述符的共享问题?

这里先放上结论:父子进程间共享全局、局部、堆区数据,以及fork之前打开的文件描述符

下面一一进行举例说明:

1.对于全局和局部数据

代码:

运行结果: 

 

结论:父子进程共享全局、局部数据(注意:程序打印出来的地址是虚拟地址)

2.堆区数据

用malloc申请堆区空间

代码:

 运行结果:

<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值