10进程学习之测试父子进程用户区共享内容读时共享写时复制的习题(实际是对全局变量的说明)

10进程学习之测试父子进程用户区共享内容读时共享写时复制的习题(实际是对全局变量的说明)

1 习题例子
我们上一篇说完,当别人问你父子进程用户区共享哪些内容时,你不能回答共享或者不共享,都是错的,因为父子进程是读时共享写时复制的。记住是父子进程都是写时复制原来的内容。

代码如下:
1)测试一,当我们在父子进程都对用户区的内容(假设只操作全局变量)写时,var都被复制了一份进行写而改变了值的内容。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

//测试fork之后父子进程读时复制写时共享
int var = 100;

int main(void)
{
	pid_t pid;
	pid = fork();

	if(pid == -1){	
		printf("Fork Failed.\n");
		return -1;
	}
	else if(pid > 0){
		sleep(1);//父进程延时,使终端描述符最后输出
		var = 200;
		printf("parent, var = %d\n", var);
	}
	else {
		var = 300;
		printf("children, var = %d\n", var);
	}

	return 0;
}

结果:在这里插入图片描述

2)测试2;当fork之后,只对父进程进行写操作,子进程只读,那么根据读时共享写时复制猜测的结果应为,父进程复制一份并且改变了值,即var=200;而子进程不会复制,对原来父进程的那份数据var进行共享读取,即var=100。
注意:有些人可能认为,父进程改了var=200之后,此时子进程也为200,并不是这样的,因为父进程也会拷贝一份原来的数据进行写,所以子进程共享的是父进程没写前var=100的值。
代码,只需将子进程的写注释即可:

//var = 300;

而实际结果和我们猜测一样。
在这里插入图片描述

3)测试3,父进程不写,子进程写,那么根据父子进程读时共享写时复制的原理,父进程为var=100;子进程为复制后写入的值var=300。
代码将上面父进程的代码注释掉即可,只对子进程写。

	else if(pid > 0){
		sleep(1);//父进程延时,使终端描述符最后输出
		//var = 200;
		printf("parent, var = %d\n", var);
	}
	else {
		var = 300;
		printf("children, var = %d\n", var);
	}

结果,同样和我们猜测的一样:
在这里插入图片描述

4)测试4,如果都不写入,那么父子进程都是共享原数据var=100这份了。
直接给出结果:
在这里插入图片描述

好了,关于父子进程共享的知识在这两篇文章已经完整的讲述完成。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值