验证父子进程能否共享全局变量

这篇博客探讨了C语言中全局变量在父子进程间的共享问题。通过一个验证代码示例,展示了当父子进程对全局变量进行读操作时,它们共享同一内存空间;但若进行修改操作,由于写时复制机制,每个进程会拥有该变量的副本,导致不共享修改后的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.验证代码

//验证父子进程能否共享全局变量
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>

int g_var=99;//定义一个全局变量
int main (){
  //创建子进程
  pid_t pid=fork();
  if(pid<0)//fork失败的情况
  {
    perror("fork error");
    return -1;
  }
  else if(pid>0)//父进程
  {
    printf("father:[%d],pid==[%d],fpid==[%d]\n",pid,getpid(),getppid());
    g_var++;//在父进程中加一
    printf("[%p]",&g_var);//看一下父子进程中这个变量的地址
  }
  else if(pid==0)//子进程
  {
    sleep(1);//为了避免父进程还没有执行,子进程已经结束了
    printf("[%p]",&g_var);
    printf("child:pid==[%d],fpid==[%d]\n",getpid(),getppid());
    printf("child:g_var==[%d]\n",g_var);
  }
  return 0;
}

2.执行结果

在这里插入图片描述

3.分析

在这里插入图片描述
父子进程不能共享全局变量:如果父子进程只是对全局变量做读操作,则父子进程在内存中只有一份,属于共享。但是如果父子进程中的任何一个进程对该变量做修改操作,会在内存中拷贝一个副本,然后在这个副本上进行修改,修改完成以后映射回去,即如图所示。--------写时复制,读时共享

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值