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