linux父子进程的代码执行理解

父子进程:

通过fork创建进程后我们需要对其返回值结果,划分子进程和父进程的专属代码区,当fork返回值大于0是为父进程的代码区,等于0时为子进程代码区,小于0则创建进程失败

        

从图中可以看出除了if语句中pid==0和pid>0时分别只由子进程和父进程单独执行,还有fork语句由父进程执行外,其他区域都是共同的代码块。

那么请问当子进程执行自己专属代码区时,改变的num值结果会不会影响父进程中num的值呢?

这里答案是不会的,父子进程的代码执行遵循 读时共享,写时拷贝。

读时共享

当子进程对变量num不进行修改操作时,子进程并不会复制父进程的地址空间,而是和父进程共享一块地址空间。

写时拷贝:

父进程执行部分和子进程执行部分都会对变量num进行操作,但是父进程和子进程对变量num的操作是独立的、互不相干的,此时便需要子进程复制父进程的地址空间,然后父、子进程在各自空间中对变量num进行操作,如下代码示例:

红蓝框分别代表父子进程要执行的代码,父子进程分别对num进行写操作,父进程加10,子进程加100,右边结果可以看出父进程先执行 (进程间执行顺序不定),在父进程专属代码区打印出的值为20,然后子进程在专属代码区打印值为110,还是在源num=10基础上加100,可以看出子进程是拷贝了一份父进程的地址,父子进程对num的操作相互独立并不影响。

执行完各自专属代码区后,打印出来num=20,num=110, 也分别是父进程和子进程各自地址空间中的num值,故上述观点成立。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值