在上图中我们看到,是存储器对程序的存储空间。从低地址到高地址我们可以看到,右边的红括号代码正文部分,存储在最低地址部位,也就是左边图中的正文段。而而初始化的数据放在上面。而定义了变量未被初始化的数据,放在左边图中图中相应位置。其中的堆空间是未被初始化的变量使用申请空间的函数进行申请空间的地方。而栈空间是对函数的调用和函数中定义的变量进行存放。
在昨天我们使用的fork()函数中,我们知道父进程调用fork()会返回新进程的pid,他们有一样的数据,但是新进程会copy一份父进程的存储空间。但是,当新进程不修改一些数据,他们之间会共享内存,当新进程会修改数据,则不会共用一个空间。具体代码如下:
int main()
{
pid_t pid;
pid_t pid2;
int a = 10;
pid = getpid();
printf("%d\n",pid);
fork();
pid2 = getpid();
printf("%d\n",pid2);
if(pid == pid2)
{
printf("this is father process\n");
}
else{
printf("this is child print,child pid = %d\n",getpid());
a= a+10;//在子进程中修改a的值
}
printf("%d,address:%d",a);
return 0;
}
在这里,其中的子进程已经不和父进程共享a的空间。因为子进程对a进行了修改。