之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享。接下来我们就来分析分析父子进程是否存在着数据共享。
我们都知道,在linux下,内存存储的位置是全局变量,栈区,堆区,以及文件。字符常量区我们这里不作分析。下面我们依次以实际代码来验证它们是否存在着数据共享。所谓的父子进程数据共享,通俗点说就是父进程或者子进程对于数据的更改,会使得子进程或者父进程的数据同步更改。代码检测的思想是让父子进程中的一个修改数据,未对数据修改的进程调用数据,查看是否数据被修改,如果数据被修改,那么证明两者之间存在着数据共享,反之没有。
1、全局变量
#include<unistd.h>
#include<string.h> int a=;
int main()
{
pid_t res=fork();
if(res==)
{
a=;
printf("child is %d\n",a);
}
else
{
sleep(); //睡眠是为了保证子进程在父进程之前先对数据进行了修改
printf("father is %d\n",a);
}
return ;
}

代码运行的结果如下:

通过结果得知,子进程对数据a进行了修改,但是父进程获取的数据确仍然是初始化的值。所以我们可以得知,在数据类型为全局变量时,父子进程之间的数据不共享。
2.栈区(局部变量区)
 
实现的代码与全局相似,只需要将int a=0在主函数中声明即可。这里直接给运行结果,不在展示源码。
 
代码运行结果如下:

我们可以看到,运行的结果与全局变量得到的结果一样,所以可以得出的结论是,当数据类型为局部变量的时候,父子进程之间的数据不共享。

3.堆区(动态内存)

可以看出,同样未有改变,与局部和全局的结果一致。则得出的结论是:当数据类型是动态开辟时,父子进程的数据不共享。

4.文件

在文件a.txt中存放了字符串hello world,然后父子进程分别去读文件,发现文件描述符偏移了2次。

通过结果我们可以看出,对于数据类型为文件时,父子进程之间共享数据,具体而言是共享了文件偏移量。
 
对此将上述进行整理后得到的父子进程之间数据共享结果如下:
 
全局变量           栈区(局部变量)           堆区(动态开辟)            文件
  不共享                      不共享                    不共享           共享文件偏移量    
 
文章转自:http://blog.sina.com.cn/s/blog_179ea19500102wz0x.html

最新文章

  1. 第16周界面设计PSP总结
  2. 浅尝辄止——在C++中调用C#的回调函数——COM方式
  3. IIS6.0开启gzip压缩(来自百度)
  4. SQL笔记-第五章,函数
  5. NABCD模型(猫咪记单词)
  6. 解决error C2011: &#39;fd_set&#39; : &#39;struct&#39; type redefinition的方法
  7. final static T
  8. 7 个基本的 JS 函数【译】
  9. vue + vuex 表单处理
  10. ubuntu常用命令(转)
  11. 调用ShellExecute需要头文件
  12. A标签-一个按钮样式
  13. 201521145048《java程序设计》第10周学习总结
  14. c# xml操作(一)
  15. linux下tar命令的常用实例
  16. SpringBoot修改Servlet相关配置
  17. GD2模块-图像处理
  18. 20155302《网络对抗》Exp6 信息收集与漏洞扫描
  19. js对象的属性:数据(data)属性和访问器(accessor)属性
  20. Netty私有协议栈 读书笔记

热门文章

  1. linux内核中的const成员是否可以修改?
  2. jenkins+docker+docker-compose完整发版流程
  3. 关于在VS2008和VS2010中禁用及卸载Visual Assist X的方法研究——转载
  4. 100个常用的Linux命令——转载
  5. tomcat生成调试日志配置
  6. puppet自动化运维
  7. Mac中opencv批量对图片进行二值化
  8. io输出流变为输入流
  9. vue分页 点击(非下拉)
  10. room 二分图最大匹配KM