

文章目录
一、前言
Hello,大家好。本文要给大家带来的是有关Linux中的进程地址空间的讲解
- 首先我们来看着一张图,相信有学习过 C/C++内存管理 的同学一定可以清楚下面的这张图。知道内存中划分了很多的区域,包括 栈区、堆区、静态区、只读常量区、代码段、共享区等等。
- 但是呢却不知道为什么要存在这样一个分布?以及为什么要这样来分布?

💬 在本文中我将会带大家去理解一下这个进程地址空间
二、细说进程地址空间
1、一段测试的代码
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <assert.h>
4
5 int g_val = 100; // 全局变量
6
7 int main(void)
8 {
9 pid_t id = fork();
10 assert(id >= 0);
11 while(1)
12 {
13 if(id == 0)
14 {
15 // child
16 printf("我是子进程,我的id是:%d, 我的父进程是:%d, g_val = %d, &g_val = %p\n", getpid(), getppid(), g_val, &g_val);
17 sleep(1);
18 }
19 else
20 {
21 // father
22 printf("我是父进程,我的id是:%d, 我的父进程是:%d, g_val = %d, &g_val = %p\n", getpid(), getppid(), g_val, &g_val); 23 sleep(2);
24 }
25 }
26 return 0;
27 }
- 然后我们来看执行的结果,可以发现因为
fork()的原因,在返回结果的时候进行了分流,继而父子进程所在的分支就都被执行了,因为父子进程所访问的都是同一个全局变量,所以我们所看到打印出来的结果的值都是一样的,而且地址也都是一样的

那现在我对上面的代码做一个小小的修改~
- 在子进程内部我们去修改一下这个
g_val的值
if</
Linux进程地址空间与页表详解

最低0.47元/天 解锁文章
1358





