【Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )

网友投稿 815 2022-05-29

文章目录

一、进程一描述

二、进程二描述

三、mmap 进程共享内存展示

一、进程一描述

在上一篇博客 【linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 , 完成了 进程一 的程序 ,

在该进程中 ,

创建并打开文件 ,

为该文件设置大小 ,

使用 mmap 创建 " 文件映射 " ,

并通过直接访问内存的方式 , 为该文件设置数据 ;

数据设置完毕后 , 休眠 8 8 8 秒 , 在这段休眠的时间段 , 运行

进程二

, 在 进程二中 ,

创建相同文件的 mmap " 文件映射 " ,

读取在 进程一 中写入的文件内容 ;

二、进程二描述

进程二 的源码 , 与上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 进程一 源码类似 , 只是将写入 mmap 文件映射 数据 , 修改为 读取 该 文件映射 数据 , 并打印出来 , 源码如下 :

#include #include #include #include #include #include #include /* 定义一个结构体 代表 " 学生 " 结构体成员中设置一个 char* 字符串 和 int 类型数据 分别代表 学生的 姓名 和 年龄 */ typedef struct { char name[4]; // 姓名 int age; // 年龄 }student; int main(int argc, char** argv) { // 打开文件的 文件描述符 int fd; // 循环控制变量 int i; // 学生结构体指针 , 指向 student 结构体类型变量 student* p_student; // 用于生成姓名字符串 char name_char; // 打开文件 fd = open(argv[1], O_CREAT | O_RDWR , 00777); // 创建文件映射 // NULL : 映射区的开始地址 // sizeof(student) * 1 : 文件映射区的长度 // PROT_READ | PROT_WRITE : 内存保护的标志位 , 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间 // fd : 文件描述符 , 被映射的文件 // 0 : 被映射文件的偏移量 , 从文件的哪个字节位置开始映射 p_student = (student*)mmap(NULL, sizeof(student) * 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // mmap 文件映射创建失败 if (p_student == (void*) - 1) { printf("mmap 文件映射创建失败 !"); return -1; } // 创建完文件映射之后 , 文件描述符就可以释放了 close(fd); // 打印 10 个 student 结构体的数据内容 for (i = 0; i < 10; i++) { // 打印 student 结构体的 name 和 age 成员 printf("name:%s , age:%d\n", (*(p_student + i)).name, (*(p_student + i)).age); } printf("第二进程 mmap 文件映射展示完毕 !\n"); return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

【Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

上述源码 , 放在 mmap_demo_02.c 文件中 , 执行

gcc mmap_demo_02.c -o mmap_demo_02

1

命令 , 编译该源码 , 编译出的可执行文件为 mmap_demo_02 ;

三、mmap 进程共享内存展示

先执行 进程一 mmap_demo_01 可执行程序 , 进程一 中通过 mmap 文件映射向文件中写出数据后 , 进入休眠阶段 ,

再执行进程二 mmap_demo_02 , 使用 mmap 文件映射访问 file 文件 , 此时打印出 进程一 中通过 mmap 文件映射写出的文件数据 ;

Linux 任务调度 项目管理 ProjectMan

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华为发布5GtoB核心网建设白皮书
下一篇:你好,我是鸿蒙OS
相关文章