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这份了。
直接给出结果:
好了,关于父子进程共享的知识在这两篇文章已经完整的讲述完成。