linux多进/线程编程(5)——进程间通信之mmap
参考资料:
1.博客1:https://www.jianshu.com/p/755338d11865
mmap:一种内存映射文件的方法 memory map
- 父子进程和无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域,实现进程间通信。
函数原型:
- #include <sys/mman.h>
- 创建映射:
- void *mmap(void *addr, size_t length, int prot, int flags,
- int fd, off_t offset);
- 释放映射的地址:
- int munmap(void *addr, size_t length);
相关描述:
- mmap() creates a new mapping in the virtual address space of the calling process. mmap在调用进程的虚拟地址空间中创建一个新的映射。
- The starting address for the new mapping is specified in addr. 这个新映射的起始地址在addr(参数1)中指定。
- The length argument specifies the length of the mapping. length参数指定映射的长度。
映射关系可以分为两种
- 1、文件映射
- 磁盘文件映射进程的虚拟地址空间,使用文件内容初始化物理内存。
- 2、匿名映射
- 初始化全为0的内存空间。关键字:MAP_ANON
一般我都会使用匿名映射,因为文件映射需要首先创建一个文件,仅起到媒介作用,参考下图:
而对于映射关系是否共享又分为
- 1、私有映射(MAP_PRIVATE)
- 多进程间数据共享,修改不反应到磁盘实际文件,是一个copy-on-write(写时复制)的映射方式。
- 2、共享映射(MAP_SHARED)
- 多进程间数据共享,修改反应到磁盘实际文件中。
匿名映射参考代码:
- #include <iostream>
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/mman.h>
- #include <sys/wait.h>
- int main() {
- //匿名映射
- int *memory = (int*) mmap(nullptr, 4, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
- if (memory == MAP_FAILED) {
- perror("mmap err!");
- return -1;
- }
- pid_t pid = fork();
- if (pid == 0) {
- //son
- *memory = 123;
- printf("son memory = %d\n", *memory);
- sleep(3);
- printf("son memory = %d\n", *memory);
- } else if (pid > 0) {
- //parent
- sleep(1);
- *memory = 45678;
- printf("parent memory = %d\n", *memory);
- wait(nullptr);//阻塞回收子进程,因为父进程先退出,所以要回收子进程,否则孤儿进程
- }
- munmap(memory, 4);
- return 0;
- }
linux多进/线程编程(5)——进程间通信之mmap的更多相关文章
- linux多进/线程编程(7)——多线程1(线程的创建,回收,分离,设置线程属性等)
参考资料: 1.博客1:https://blog.csdn.net/zhou1021jian/article/details/71531699 2.博客2:https://blog.csdn.net/ ...
- linux多进/线程编程(4)——进程间通信之pipe和fifo
前言: Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块 ...
- linux多进/线程编程(2)—— fork函数和进程间“共享”数据
参考: 1.博客1:https://www.pianshen.com/article/4305691855/ fork:在原进程的基础上"分叉"出一个子进程,即创建一个子进程. N ...
- linux多进/线程编程(3)——wait、waitpid函数和孤儿、僵尸进程
当使用fork创建多个进程后,需要解决子进程回收的问题.wait和waitpid函数就是做这个工作的. 假设子进程没有合理的回收,可能会带来两个问题: 1.孤儿进程(父进程挂了,子进程活着),孤儿进程 ...
- linux多进/线程编程(1)—— 基础概念(PCB、MMU、进程状态)
学习大概就是不断迭代.重构的过程,不复习的学习是不负责任的,亦是无用的. 本系列博客主要作为个人记录,主要是贴图和代码,不做详细解释,以后有时间可能会重写:从下一篇开始上代码,代码可以运行是对自己的最 ...
- 《Linux多线程服务端编程》笔记——线程同步精要
并发编程基本模型 message passing和shared memory. 线程同步的四项原则 尽量最低限度地共享对象,减少需要同步的场合.如果确实需要,优先考虑共享 immutable 对象. ...
- Linux线程编程之信号处理
前言 Linux多线程环境中的信号处理不同于进程的信号处理.一方面线程间信号处理函数的共享性使得信号处理更为复杂,另一方面普通异步信号又可转换为同步方式来简化处理. 本文首先介绍信号处理在进程中和线程 ...
- 一、智能指针及线程同步总结------linux多线程服务端编程
更新2.0 二.多线程及服务器编程总结------linux多线程服务端编程 https://www.cnblogs.com/l2017/p/11335609.html 三.分布式编程总结------ ...
- Win64 驱动内核编程-11.回调监控进线程句柄操作
无HOOK监控进线程句柄操作 在 NT5 平台下,要监控进线程句柄的操作. 通常要挂钩三个API:NtOpenProcess.NtOpenThread.NtDuplicateObject.但是在 VI ...
随机推荐
- 函数的参数python教程
一:函数 什么是函数? 函数就类似于工具 提前定义之后可以反复使用 代码冗余 结构清晰 修改繁杂等问题 二:函数的语法结构 def 函数名(参数1,参数2) '''函数注释''' 函数体代码 retu ...
- pycharm 安装插件
1.使用pip安装插件 pip安装指定版本的插件: pip install openpyxl==2.6.2 -i https://pypi.doubanio.com/simple/ -i后面跟的是&q ...
- 人工智能与智能系统2-> 机器人学2 | 时间与运动
<Robotics, Vision and Control>学习到第三章,我才发现这本书是有配套视频的,第二章看的好辛苦,很多地方生硬理解了一下,现在打算把视频再好好看一看,作为补充,也会 ...
- Codeforces Round #746 Div. 2
掉分快乐qwq C题代码以及分析(在注释里) /* * @Author: Nan97 * @Date: 2021-10-04 22:37:18 * @Last Modified by: Nan97 * ...
- ApacheCN - 关于我们
1.简单介绍一下 ApacheCN? ApacheCN 是 2016 年 8 月份就开始搭建网站雏形, 2017 年 6 月份正式全职来做,是国内第一个有组织性.敢带人装逼.敢真的分享.并且敢戴绿帽的 ...
- VC 模拟键盘输入
转载请注明来源:https://www.cnblogs.com/hookjc/ vc模拟键盘输入keybd_event(VK_LWIN, 0, 0 ,0);keybd_event('M', 0, 0 ...
- C语言非阻塞式键盘监听
监听键盘可以使用C语言的字符输入函数,例如 getchar.getch.getche 等,使用getche函数监听键盘的例子: #include <stdio.h> #include &l ...
- js读取txt文件并下载
//我在vue中测试, 可行, 这个只适用于google浏览器, ie需要xObject对象 // 下载txt if (/(txt)$/.test(name[1])) { var xhr = new ...
- Lua 语言: 语法
转载请注明来源:https://www.cnblogs.com/hookjc/ -- 两个横线开始单行的注释 --[[ 加上两个[和]表示 多行的注释.--]] -------------- ...
- MyBatis动态SQL和缓存
1. 什么是动态SQL 静态SQL:静态SQL语句在程序运行前SQL语句必须是确定的,SQL语句中涉及的表的字段名必须是存在的,静态SQL的编译是在程序运行前的. 动态SQL:动态SQL语句是在程序运 ...