Linux系统编程:mmap介绍和使用mmap实现进程间通信
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实现进程间通信相关推荐
- Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】
linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...
- 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)
文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...
- 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)
此为牛客Linux C++和黑马Linux系统编程课程笔记. 1. fork函数 1.1 fork创建单个子进程 #include<unistd.h> pid_t fork(void); ...
- 【Linux系统编程】守护进程、线程
------------->[Linux系统编程/网络编程](学习目录汇总) <-------------- 目录 1.守护进程 1.1 进程组 1.2 会话 1.3 setsid()函数 ...
- Linux系统编程总结
day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末 ...
- Linux系统编程——进程
一.进程概念 基础 程序:死的.只占用磁盘空间. --剧本 进程:活的.运行起来的程序.占用内存,cpu等系统资源. --戏 并发 并发的出现基于CPU的发展.然后有了多道程序设计(多进程并发执行). ...
- Linux 系统编程总结 (未完待续)
前言 我记得去年说过要讲一些干货分享给大家,Linux 系统编程是linux 驱动开发入门的条件 有人说为什么? mmap select read write open ioctl socket po ...
- Linux系统编程(三)进程间的通信
Linux系统编程(三)进程间的通信 一.为什么需要进程之间的通信(IPC)? 二.管道 1.概念 2.特质 3.原理 4.局限性 5.代码 2.读入数据 三.共享存储映射 注意事项 父子进程通信 一 ...
- Linux系统编程及应用——ubuntu环境下
Linux系统编程及应用--ubuntu环境下 程序由业务逻辑和系统访问两部分构成的.其中,业务逻辑是根据业务需求,按照设计好的逻辑规则,处理信息,与系统(平台)无关的:而系统访问则是利用操作系统所提 ...
- 【读书笔记】linux系统编程
linux系统编程 原作名:Linux System Programming 作者: Robert Love 第一章 入门和基本概念 1.1 系统编程 应用程序需要与更高层次的库进行交互,系统程序就是 ...
最新文章
- IPython 8.0大版本更新:Debug报错提示更清晰,加入自动代码补全
- 在linux下安装星际译王
- 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子
- P2056-[ZJOI2007]捉迷藏【点分树,堆】
- 阿里云的这个智能编码插件真心好用!Java 开发神器!!!
- ❤️20行Python代码❤️一键整理桌面、文件夹❤️世界都清净了❤️
- Java学习电子书大全
- 【PC工具】windows免安装录屏绿色软件,无需注册无水印绿色录屏软件
- Windows 10图标如何调整?
- i.MX6ULL终结者MPU6050 六轴传感器例程MPU6050简介
- webpack常用基础配置的一些总结
- matlab中求极值extr,extr.m · A.Star算法组/snowland-itd-matlab - Gitee.com
- 查看git HEAD
- 注解整理 - 元注解,lombok注解,spring 注解,springboot注解,springmvc注解
- python台风动图绘制_NCL绘制台风路径
- 微信实名认证在哪里?分享详细认证步骤
- 看这一篇就够了:写简历、面试、谈薪酬的技巧和防坑指南
- 大一新手求助c语言软件
- csharp(CS1519)
- 在JavaScript中组合字符串的4种方法
热门文章
- 基础省选+NOI-第6部分 字符串
- NOI入门级:数据结构之线性表
- ThinkPHP6项目基操(7.模型)
- XShell笔记-XShell登录脚本的使用
- Java笔记-springframework.ws中拦截器的使用(SOAP)
- Leaflet笔记-Leaflet与echarts结合使用(在地图上绘图表)
- Qt工作笔记-QString中Split与section效率实践
- C++ opengl GL_QUAD_STRIP的绘制
- java writedouble_Java FSDataOutputStream.writeDouble方法代碼示例
- php使用axios发送请求,axios源码之模拟实现axios发送请求