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 ...
随机推荐
- IDEA构建Maven项目过慢的解决方法
创建Maven项目时在此页面添加 archetypeCatalog internal 即可
- Typora下载安装教程(全面)
Typora下载与安装 一:下载 1.1百度搜索 https://www.typora.io/ 点击链接进入后映入眼帘的就是一款简洁的Typora网页,然后下滑进入主页. 1.2点击Download( ...
- 直接copy大于某一个时间小于某一个时间的文件--find进阶用法
find ./ -type f -newermt '2000-01-04 10:30:00' ! -newermt '2019-10-28 10:57:00' -exec cp -a {} /var/ ...
- spring 整合shiro框架 模拟登录控制器。
一.导入shiro jar包. 我在maven项目中,将常用的jar包都放在里面. <?xml version="1.0" encoding="UTF-8&qu ...
- openstack horizon 学习(3) DataTable
上一篇中粗略的讲了下openstack中horizon的dashboard和panel的添加,本打算在这章中对有关于pluggable settings中的配置做详细的总结,然放弃了这念头.原因是搞懂 ...
- JspSmartUpload 简略中文API文档
感谢原文作者:~数字人生~ 原文链接:https://www.cnblogs.com/mycodelife/archive/2009/04/26/1444132.html 一.JspSmartUplo ...
- sublime配置大全
配置:Preferences→Settings-User 字体和字体大小 "font_face": "YaHei Consolas Hybrid", " ...
- python unittest控制用例的执行顺序
为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的 ...
- 关于linux shell编程,alias rm='cp $@ ~/backup; rm $@'
书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp $@ ~/backup; ...
- k8s之Pod基础概念
1. 资源限制 Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象.一个Pod代表着集群中运行的一个进程.kubernetes中其他大多数组件都是围绕着Pod来 ...