mmap函数使用实例
NAMEmmap, munmap - map or unmap files or devices into memorySYNOPSIS#include <sys/mman.h>/* 映射,返回值为映射到的最终地址。
addr: 目标内存空间 放到当前进程空间的起始地址,若为空,则函数自己找可用的位置
length:需要映射目标空间的长度
port : 映射过来的内存属性,即可以对该内存做什么操作,即映射后的操作权限PROT_EXEC Pages may be executed.PROT_READ Pages may be read.PROT_WRITE Pages may be written.PROT_NONE Pages may not be accessed.
flags :标记,特殊要求,位图必选:MAP_SHARED : 进程对进程对映射过来的内存修改,会同步到真实的内存空间。MAP_PRIVATE:进程对映射过来的内存修改,只是改动当前进程空间中目标内存空间,不会同步到真实的内存空间可选:如:MAP_ANONYMOUS 匿名映射,当前映射不依赖于任何文件(fd选项为-1),类似于 malloc()功能,空间会被初始化为0fd : 文件描述符,如 需要映射一个文件过来,那么需要先将目标文件打开。
offset :偏移量
从 fd 文件的 offset偏移量开始映射,映射length长度的空间到当前进程空间的addr地址,空间权限设置为port ,特殊要求是flags */void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);/*解除映射
对 addr地址处 映射过来的空间(大小为length) 进行解除映射
如果 mmap()的时候 flags 有MAP_ANONYMOUS 匿名映射要求,则此处munmap() 类似于 free()
*/
int munmap(void *addr, size_t length);
实例:
父子间同时改变共享内存的值,用无名信号量同步
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/wait.h>#define PATHNAME "/tmp/out"int main(int argc, char **argv)
{sem_t *semp = NULL;key_t key;int shmid;int proc_id = 1;size_t size = 4096;int *shmp = NULL;pid_t pid;int n = 100000LL;key = ftok(PATHNAME, proc_id);if (key < 0){perror("ftok()");exit(1);}shmid = shmget(key, size, IPC_CREAT | 0666);if (shmid < 0){perror("shmget()");exit(1);}shmp = shmat(shmid, NULL, 0);if (shmp == NULL){perror("shmat()");exit(1);}*shmp = 0;semp = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);if (semp == NULL){perror("mmap()");exit(1);}if (sem_init(semp, 1, 1) < 0){perror("sem_init()");exit(1);}pid = fork();if (pid < 0){perror("fork()");exit(1);}if (pid == 0){while (n--){sem_wait(semp);(*shmp)++;sem_post(semp);}exit(0);}while (n--){sem_wait(semp);(*shmp)++;sem_post(semp);}wait(NULL);printf("%d\n",*shmp);sem_destroy(semp);shmdt(shmp);munmap(semp, sizeof(sem_t));exit(0);
}
mmap函数使用实例相关推荐
- mmap函数的用法详解及实例分析
1.mmap函数是一个比较神奇的函数,它可以把文件映射到进程的虚拟内存空间.通过对这段内存的读取和修改,可以实现对文件的读取和修改,而不需要用read和write函数.如下图所示,为mmap实现原理的 ...
- 共享内存:mmap函数实现
内存映射的应用: 以页面为单位,将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能; 将特殊文件进行匿名内存映射,可以为关联进程提供共享内存 ...
- 共享内存映射之mmap()函数详解
转 共享内存映射之mmap()函数详解 /span> 查看全文 http://www.taodudu.cc/news/show-3175071.html 相关文章: 子集生成(二进制法,逐步生成 ...
- python输入字符串转换为公式_将python字符串转化成长表达式的函数eval实例
爬一个网页时,要保存的数据都没有encode,就导致保存下来的中文都变成unicode了... 那么,怎么把一个表示字符串的unicode还原成unicode呢? 函数eval(expression) ...
- python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...
本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...
- 共享内存简介和mmap 函数
一.共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. 即每个进程地址空间都有一个共享存储器的映射区,当这块区 ...
- 【Android 逆向】函数拦截实例 ( ③ 刷新 CPU 高速缓存 | ④ 处理拦截函数 | ⑤ 返回特定结果 )
文章目录 前言 一.刷新 CPU 高速缓存 二.处理拦截函数 1.桩函数 2.处理拦截函数 三.返回特定结果 四.相关完整代码 前言 [Android 逆向]函数拦截实例 ( 函数拦截流程 | ① 定 ...
- 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )
文章目录 前言 一.函数拦截需要的几个参数 二.插桩前先保存实际函数入口 6 字节数据 三.在插桩的函数入口写入跳转指令 | 构造拼接桩函数 前言 [Android 逆向]函数拦截实例 ( 函数拦截流 ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )
文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...
最新文章
- Conv1D和Conv2D的区别
- Linux程序包管理之RPM
- PHP下ajax跨域的解决方案之CORS
- ES6标准学习: 4、数组的扩展
- [轉]俞老师在同济大学的演讲词:度过有意义的生命
- crawler_x-requested-with 请求头
- 卧槽!VS Code 上竟然也能画流程图了???
- java基础之多线程笔记
- 养老金8000元左右,身体好,无负担,怎样安排退休生活好呢?
- 计算机网络 ——网络原理之初识
- 反病毒工具-LordPE
- 【李守聪原创】攻坚克难,梦在远方
- 网络数据传输的封装总结
- .xyz让域名应用充满艺术感
- oracle trim函数用法详解
- 三十四、进阶之获取详情页面信息并显示
- Unity使用新输入系统InputSystem制作飞机大战Demo
- 芋道 Spring Boot 消息队列 RocketMQ 入门
- 弹出并点击弹框关闭 自定义toast_网页自定义toast提示框
- [端口] - 端口大全及端口关闭方法
热门文章
- Revit项目和族文件升级后出现无响应死机情况
- 你是否了解工作流软件与OA之间的关系?
- 2020款Macbook Pro忘了激活锁账户密码如何向苹果申请解锁
- 在2022年,如何为一加3T刷入Kali Nethunter的最新版本
- opencv与IP摄像头的故事
- mysql模糊查询xml_在userMapper.xml文件中模糊查询的常用的3种方法
- docker-compose搭建prometheus+granafa+alertmanager+dingtalk
- java编程基础(一)十六进制
- 嵌入式 LED 万年历
- Unity使用FairyGUI切换Spine