千家信息网

Linux系统编程中共享内存的mmap函数是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Linux系统编程中共享内存的mmap函数是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。共享内存概念共享内存是通信效率最高的IPC
千家信息网最后更新 2026年11月01日Linux系统编程中共享内存的mmap函数是什么

Linux系统编程中共享内存的mmap函数是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

共享内存概念

共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备。但是它没有自带同步机制,需要配合信号量等方式来进行同步。

共享内存被创建以后,同一块物理内存被映射到了多个进程地址空间,当有一个进程修改了共享内存的数据,其余的进程均可看见所修改的内容,反之亦然。

mmap函数

函数原型:

void mmap(void adrr, size_t length, int prot, int flags, int fd, off_t offset);

返回值:

  • 成功:返回创建的映射区首地址;

  • 失败:返回MAP_FAILED

具体参数含义:

  • addr:指向映射区的首地址,这是由系统内核所决定的,一般设为NULL;

  • length:欲创建的映射区大小;

  • prot:映射区的权限,一般有如下几种:

  • PROT_EXEC 映射区域可被执行

  • PROT_READ 映射区域可被读取

  • PROT_WRITE 映射区域可被写入

  • PROT_NONE 映射区域不能存取

  • flags:指映射区的标志位,MAP_FIXED与MAP_PRIVATE必须选择一个:

  • MAP_FIXED:对映射区所作的修改会反映到物理设备,但需要调用msync()或者munmap();

  • MAP_PRIVATE:对映射区所作的修改不会反映到物理设备。

  • fd:创建的映射区的文件描述符;

  • offset:被映射文件的偏移量,一般设为0,表示从头开始映射。

mumap函数

函数原型:

int munmap(void *addr, size_t length);

函数作用:

如同malloc之后需要free一样,mmap调用创建的映射区使用完毕之后,需要调用munmap去释放。

例程

写进程:

 #include   #include   #include   #include   #include   #include   #include     typedef struct {11    int id;     char name[20];     char gender; }stu;  int main(int argc, char *argv[]) {     stu *p = NULL;     int fd = 0;     stu student = {10, "harry", 'm'};     if (argc < 2) {         printf("useage: ./a.out file\n");         return -1;     }      fd = open(argv[1], O_RDWR | O_CREAT, 0664);     if (fd == -1) {         printf("ERROR: open failed!\n");         return -1;     }     ftruncate(fd, sizeof(stu));      p = mmap(NULL, sizeof(stu), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);     if (p == MAP_FAILED) {         printf("ERROR: mmap failed!\n");         return -1;     }      close(fd);      while (1) {         memcpy(p, &student, sizeof(stu));         student.id++;         sleep(2);     }     munmap(p, sizeof(stu));      return 0; }

读进程:

 #include   #include   #include   #include   #include   #include     typedef struct  {     int id;     char name[20];     char gender; }stu;  int main(int argc, char *argv[]) {     stu *p = NULL;     int fd = 0;      if (argc < 2) {         printf("useage: ./a.out file\n");         return -1;     }      fd = open(argv[1], O_RDONLY);     if (fd == -1) {         printf("ERROR: open failed!\n");         return -1;     }      p = mmap(NULL, sizeof(stu), PROT_READ, MAP_SHARED, fd, 0);     if (p == MAP_FAILED) {         printf("ERROR: mmap failed!\n");         return -1;     }      close(fd);      while (1) {         printf("id = %d, name = %s, gender = %c\n", p->id, p->name, p->gender);         sleep(2);     }      munmap(p, sizeof(stu));      return 0; }

看完上述内容,你们掌握Linux系统编程中共享内存的mmap函数是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

内存 函数 进程 区域 系统 内容 地址 物理 编程 原型 数据 文件 方式 方法 更多 设备 问题 同步 最高 成功 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技 互联网科技园 湖北九亚互联网络科技有限公司 河南云网互联网络科技有限公司 深圳恒合互联网络科技有限公司 互联网金融监管科技数据 新华互联网科技学院 互联网科技卖菜 友谊互联网络科技 互联网科技公司有哪些 上海电发互联网科技有限公司 昭通云南众福互联网科技有限公司 上海宁丞科技互联网 荆州市昕露互联网络科技有限公司 卓翼科技产业互联网合作 互联网企业科技类企业如何做账 江苏互联网科技小贷 珠海东科互联网科技有限公司 互联网科技和医药行业 深圳互联网科技园地址 深圳恒合互联网络科技有限公司 没上市的科技互联网公司 合肥互联网科技公司 福州新华互联网科技学校 知乎 互联网科技寓意 哈尔滨屹滨互联网科技有限公司 亳州好赞互联网科技有限公司 天津腾达互联网科技有限公司 北京互联网科技类企业分布 盐城市攀科互联网科技有限公司
0