之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享。接下来我们就来分析分析父子进程是否存在着数据共享。
我们都知道,在linux下,内存存储的位置是全局变量,栈区,堆区,以及文件。字符常量区我们这里不作分析。下面我们依次以实际代码来验证它们是否存在着数据共享。所谓的父子进程数据共享,通俗点说就是父进程或者子进程对于数据的更改,会使得子进程或者父进程的数据同步更改。代码检测的思想是让父子进程中的一个修改数据,未对数据修改的进程调用数据,查看是否数据被修改,如果数据被修改,那么证明两者之间存在着数据共享,反之没有。
 
1、全局变量

代码运行以及运行结果如下:

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

我们可以看到,运行的结果与全局变量得到的结果一样,所以可以得出的结论是,当数据类型为局部变量的时候,父子进程之间的数据不共享。
 
.堆区(动态内存)
 
代码以及运行结果如下:

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

4.文件

通过结果我们可以看出,对于数据类型为文件时,父子进程之间共享数据,具体而言是共享了文件偏移量。
 
对此将上述进行整理后得到的父子进程之间数据共享结果如下:
 
全局变量           栈区(局部变量)           堆区(动态开辟)            文件
  不共享             不共享                    不共享           共享文件偏移量    
 
【补充】PCB进程控制块:

转自:http://blog.sina.com.cn/s/blog_179ea19500102wz0x.html  (有改动)

【Linux 进程】之关于父子进程之间的数据共享分析的更多相关文章

  1. 【Linux 进程】fork父子进程间共享数据分析

    之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...

  2. linux中用管道实现父子进程通信

    1 用户要实现父进程到子进程的数据通道,可以在父进程关闭管道读出一端, 然后相应的子进程关闭管道的输入端. 2 先用pipe()建立管道 然后fork函数创建子进程.父进程向子进程发消息,子进程读消息 ...

  3. Linux--谈父子进程执行过程

    fork函数用于从已存在进程中创建一个新进程,新进程成为子进程,原进程成为父进程.这两个进程分别返回他们各自的返回值, 其中父进程的返回值是子进程的进程号,子进程则返回0,因此返回值大于0标识父进程, ...

  4. linux进程通信之使用匿名管道进行父子进程通信

    管道:是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称pipe文件. 管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起 ...

  5. LINUX编程学习笔记(十四) 创建进程与 父子进程内存空间

    1什么是进程:进程是一个执行中的程序 执行的程序: 代码->资源->CPU 进程有很多数据维护:进程状态/进程属性 所有进程属性采用的一个树形结构体维护 ps  -a//所有进程 ps - ...

  6. linux父子进程问题

    今天遇到一个linux进程启动时指定Max open files不对的问题,导致程序建立socket异常,进而导致fullgc问题,影响正常服务.所以顺带又温习了下linux下的父子进程的特性. 孤儿 ...

  7. linux: c语言 关闭标准输出STDOUT_FILENO对父子进程的影响

    简介标准 I/O 库(stdio)及其头文件 stdio.h 为底层 I/O 系统调用提供了一个通用的接口.这个库现在已经成为 ANSI 标准 C 的一部分.标准 I/O 库提供了许多复杂的函数用于格 ...

  8. C/C++ 父子进程之间的文件描述符问题

    在C程序中,文件由文件指针或者文件描述符表示.ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O ...

  9. Linux 利用管道父子进程间传递数据

    [原文] fork()函数:用于创建子进程,子进程完全复制父进程的资源,相当于父进程的拷贝.具体理解,运用父进程的同一套代码,通过判断进程ID来执行不同进程的不同任务. 返回值正常为子进程ID,出错返 ...

随机推荐

  1. linux shell 命令常用快捷键

    下面是一些shell的常用快捷键,快捷键玩熟悉了在一定程度上是可以提高工作效率滴… Ctrl + a 切换到命令行开始 Ctrl + e 切换到命令行末尾 Ctrl + l 清除屏幕内容 Ctrl + ...

  2. ROS的工作模式和ESXI网卡工作模式的关系

    1.ROS网卡如果工作在桥接模式,那么ESXI网卡的工作模式必须设置为Promiscuous Mode(混杂模式)和Forged Transmits(伪传输)这两个必须都为开启状态,如下: 这种情况, ...

  3. Fragment之介绍(转)

    http://www.cnblogs.com/plokmju/p/3239265.html 前言 开门见山开篇名义,本篇博客将讲解一下Android中Fragment的内容,必要的地方会提供相应的演示 ...

  4. javascript节点操作移出节点removeChild()

    removeChild(a)是用来删除文档中的已有元素 参数a:要移出的节点 <div id="guoDiv"> <span>1</span> ...

  5. 解决Sybase PowerDesigner 数据库设计中 Name 自动填充Code

    在使用 Sybase PowerDesigner 进行数据库设计时,为了理清思路,需要将name改为中文名称,但是这个软件会自动将name填 充为code,可以通过如下配置修改: 选择tools-&g ...

  6. ORM sqlachemy学习

    内容: 1.ORM介绍 2.SQLAlchemy介绍 3.SQLAlchemy内部处理 4.SQLAlchemy使用 参考: http://www.cnblogs.com/wupeiqi/articl ...

  7. 写下thinkphp5和thinkphp3.2的不同

    只列出一些自己的直观感受 1 引入了命令行,估计来源是laravel,前阵子刚练手完laravel5.0的系统, 感觉thinkphp5的命令行和laravel的很像 2 引入了路由,来源估计也是la ...

  8. windows,linux,esxi系统判断当前主机是物理机还是虚拟机?查询主机序列号命令

    参考网站:https://blog.csdn.net/yangzhenping/article/details/49996765 查序列号: http://www.bubuko.com/infodet ...

  9. C# EF 基础操作

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. spring quartz 任务注入spring service

    SchedulerFactoryBean+AdaptableJobFactory+QuartzJobBean package schedule.quartz5; import org.quartz.S ...