mmap函数介绍

这个函数有啥子作用?m-> memory 内存,map ->映射,见名知义,就是创建内存映射区,作用就是:将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。所以我们可以用mmap来修改文件,也可以用于进程间通信

函数原型

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);看上去参数比较多,我们理解了也就没啥子了。

void *addr:映射区的首地址,你知道么?肯定不知道创建了才有,传NULL

size_t length:映射区的大小,可以传文件大小,也可以自己自己指定,单位是byte。不能为0。

int prot:映射区权限,可以为:PROT_READ 映射区必须要有读权限,PROT_WRITE,PROT_READ|PROT_WRITE

int flags:标志位参数,可以为MAP_SHARED 修改内存数据会同步到磁盘。MAP_PRIVATE 修改了内存数据不会同步到磁盘

int fd:文件描述符,要映射的文件对应的id。通过open函数得到

off_t offset:映射文件的偏移量,要么为0 要么为4k的整数倍.

munmap函数

创建了内存映射区,当然也要对应的释放内存映射区的操作,这里就用的munmap了。比较简单,直接看函数原型:

int munmap(void *addr, size_t length);

addr 为映射区地址就是 mmap返回值,length 就是 mmap 中你指定的长度。

使用mmap实现进程间通信

我们用mmap来实现 2个 进程间的通信,一个进程写数据,另一个进程读数据。我们这里让write 进程每次sleep 1s,read进程每次sleep 2s,这样更能看见效果。

mmap_file_write.c

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>int main(void)
{int fd = open("temp",O_RDWR|O_CREAT,0664);if(fd==-1){perror("open hello");exit(1);}ftruncate(fd,4096);int len = lseek(fd,0,SEEK_END);void* ptr = mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(ptr == MAP_FAILED){perror("mmap error");exit(1);}char* temp = (char*)ptr;int i = 1;while(1){//对映射区进行写操作char str[1024]={0};sprintf(str,"This is line %d",i);strcpy(temp,str);//temp[0] = 'a';printf("写入数据:%s\n",temp);temp += strlen(str);sleep(1);i++;}//释放内存映射区int ret = munmap(ptr,len);if(ret==-1){perror("munmap");exit(1);}close(fd);return 0;
}

mmap_file_read.c

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>int main(void)
{int fd = open("temp",O_RDWR|O_CREAT,0664);if(fd==-1){perror("open hello");exit(1);}ftruncate(fd,4096);int len = lseek(fd,0,SEEK_END);void* ptr = mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(ptr == MAP_FAILED){perror("mmap error");exit(1);}char* temp = (char*)ptr;while(1){//对映射区进想读操作char str[1024] = {0};strcpy(str,temp);printf("%s\n",str);temp+=strlen(str);sleep(2);}int ret = munmap(ptr,len);if(ret==-1){perror("munmap");exit(1);}close(fd);return 0;
}

进程间通信效果

Linux系统编程:mmap介绍和使用mmap实现进程间通信相关推荐

  1. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  2. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  3. 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)

    此为牛客Linux C++和黑马Linux系统编程课程笔记. 1. fork函数 1.1 fork创建单个子进程 #include<unistd.h> pid_t fork(void); ...

  4. 【Linux系统编程】守护进程、线程

    ------------->[Linux系统编程/网络编程](学习目录汇总) <-------------- 目录 1.守护进程 1.1 进程组 1.2 会话 1.3 setsid()函数 ...

  5. Linux系统编程总结

    day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末 ...

  6. Linux系统编程——进程

    一.进程概念 基础 程序:死的.只占用磁盘空间. --剧本 进程:活的.运行起来的程序.占用内存,cpu等系统资源. --戏 并发 并发的出现基于CPU的发展.然后有了多道程序设计(多进程并发执行). ...

  7. Linux 系统编程总结 (未完待续)

    前言 我记得去年说过要讲一些干货分享给大家,Linux 系统编程是linux 驱动开发入门的条件 有人说为什么? mmap select read write open ioctl socket po ...

  8. Linux系统编程(三)进程间的通信

    Linux系统编程(三)进程间的通信 一.为什么需要进程之间的通信(IPC)? 二.管道 1.概念 2.特质 3.原理 4.局限性 5.代码 2.读入数据 三.共享存储映射 注意事项 父子进程通信 一 ...

  9. Linux系统编程及应用——ubuntu环境下

    Linux系统编程及应用--ubuntu环境下 程序由业务逻辑和系统访问两部分构成的.其中,业务逻辑是根据业务需求,按照设计好的逻辑规则,处理信息,与系统(平台)无关的:而系统访问则是利用操作系统所提 ...

  10. 【读书笔记】linux系统编程

    linux系统编程 原作名:Linux System Programming 作者: Robert Love 第一章 入门和基本概念 1.1 系统编程 应用程序需要与更高层次的库进行交互,系统程序就是 ...

最新文章

  1. IPython 8.0大版本更新:Debug报错提示更清晰,加入自动代码补全
  2. 在linux下安装星际译王
  3. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子
  4. P2056-[ZJOI2007]捉迷藏【点分树,堆】
  5. 阿里云的这个智能编码插件真心好用!Java 开发神器!!!
  6. ❤️20行Python代码❤️一键整理桌面、文件夹❤️世界都清净了❤️
  7. Java学习电子书大全
  8. 【PC工具】windows免安装录屏绿色软件,无需注册无水印绿色录屏软件
  9. Windows 10图标如何调整?
  10. i.MX6ULL终结者MPU6050 六轴传感器例程MPU6050简介
  11. webpack常用基础配置的一些总结
  12. matlab中求极值extr,extr.m · A.Star算法组/snowland-itd-matlab - Gitee.com
  13. 查看git HEAD
  14. 注解整理 - 元注解,lombok注解,spring 注解,springboot注解,springmvc注解
  15. python台风动图绘制_NCL绘制台风路径
  16. 微信实名认证在哪里?分享详细认证步骤
  17. 看这一篇就够了:写简历、面试、谈薪酬的技巧和防坑指南
  18. 大一新手求助c语言软件
  19. csharp(CS1519)
  20. 在JavaScript中组合字符串的4种方法

热门文章

  1. 基础省选+NOI-第6部分 字符串
  2. NOI入门级:数据结构之线性表
  3. ThinkPHP6项目基操(7.模型)
  4. XShell笔记-XShell登录脚本的使用
  5. Java笔记-springframework.ws中拦截器的使用(SOAP)
  6. Leaflet笔记-Leaflet与echarts结合使用(在地图上绘图表)
  7. Qt工作笔记-QString中Split与section效率实践
  8. C++ opengl GL_QUAD_STRIP的绘制
  9. java writedouble_Java FSDataOutputStream.writeDouble方法代碼示例
  10. php使用axios发送请求,axios源码之模拟实现axios发送请求