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


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

    代码运行的结果如下:

    通过结果得知,子进程对数据a进行了修改,但是父进程获取的数据确仍然是初始化的值。所以我们可以得知,在数据类型为全局变量时,父子进程之间的数据不共享。

     

    2.栈区(局部变量区)
     
    实现的代码与全局相似,只需要将int a=0在主函数中声明即可。这里直接给运行结果,不在展示源码。
     
    代码运行结果如下:

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

    3.堆区(动态内存)

     

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

    4.文件

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

    通过结果我们可以看出,对于数据类型为文件时,父子进程之间共享数据,具体而言是共享了文件偏移量。
     
    对此将上述进行整理后得到的父子进程之间数据共享结果如下:
     
    全局变量           栈区(局部变量)           堆区(动态开辟)            文件
      不共享                      不共享                    不共享           共享文件偏移量    
     
    文章转自:http://blog.sina.com.cn/s/blog_179ea19500102wz0x.html
  • 相关阅读:
    supervisor使用小记
    linux新增定时脚本
    page_fault_in_nonpaged_area异常解决方案(已解决)
    和安卓对接老是ping不通?试试内网映射
    github文件下载加速器
    mybatis新增账号并且返回主键id
    arraylist源码解析
    MySQL安装教程
    通过get方法的方式获取配置项信息
    @Inject注解
  • 原文地址:https://www.cnblogs.com/xuelisheng/p/10072065.html
Copyright © 2020-2023  润新知