mmap的使用

2023-05-16

参考资料

mmap 函数:原理与使用(含代码)
mmap函数使用与实例详解
Linux系统编程:mmap使用技巧
mmap和普通文件读写的区别和比较 & mmap的注意点

认真分析mmap:是什么 为什么 怎么用
github源码

一、mmap读入文件

#include<iostream>
#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>

using namespace std;
void CreateFromFile(string& FileName)
	{//由数据文件FileName创建图

		

		//size_t i;

		//打开文件,fd为文件描述符
		int fd = open(FileName.c_str(), O_RDONLY);
		//cout << "fd   " << fd << endl;

		//文件长度
		int len = lseek(fd, 0, SEEK_END);
		//cout << "len   " << len << endl;

		//文件映射
		char* data = (char*)mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);

		//关闭文件,若放在此处不行就放在文件末尾munmap函数之前
		close(fd);

		auto p_end = data;
		//unsigned int num_s[3];//用来存放数据

		vector_3 value;
		while (*p_end != '\0')
		{
			for (short int i = 0; i < 3; ++i)
			{
				value.value[i] = strtoul(p_end, &p_end, 10);//将char数组转换为unsigned int类型,保存在数组num_s中
				++p_end;
				if (i < 2)
				{
					//node_set.insert(tmp_arcs[tmp_arcs_size][i]);
					//node_set[node_set_size++] = tmp_arcs.data_line[tmp_arcs_size][i];
					//node_set.insert(value.value[i]);
					node_set.push_back(value.value[i]);
				}
			}
			//tmp_arcs_size += 1;

			tmp_arcs.push_back(value);
		}
		// 解除映射,释放空间
		munmap(data, len);

		do somthing;

二、mmap写入文件

#include<iostream>
#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>

using namespace std;
void PrintResult(string& outFileName)
/*********************写入文件+交替写入+mmap写+***********************/		
	{

		do something;
		
		string total_size_s = to_string(total_size) + "\n";
		int len = total_size_s.size() + 1;
		for (int i = 0; i < THREAD_NUM; ++i)
		{
			len += answer_len[i];
		}
		// 打开文件
		int fd = open(outFileName.c_str(), O_RDWR | O_CREAT, 0666);
		//先给文件申请一个大小,写入一个字符进行保证
		lseek(fd, len - 1, 0);
		write(fd, "h", 1);//可能就是这个文件搞的鬼
		// 使用mmap函数建立内存映射
		char* addr = (char*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
		// 内存映射建立好了,此时可以关闭文件了
		close(fd);
		auto iter = addr;


		memcpy(addr, total_size_s.c_str(), total_size_s.size());
		addr += total_size_s.size();


		//交替进行输出
		uint t[THREAD_NUM];
		uint process_id = 0;
		for (uint i = 0; i < 5; ++i)
		{
			for (uint j = 0; j < THREAD_NUM; ++j)
				t[j] = 0;

			process_id = 0;
			while (size[i])
			{
				for (uint j = 0; j < THREAD_NUM; ++j)
				{
					while (t[j] < result_stat[j][i].size() && result_stat[j][i][t[j]] == process_id)
					{

						memcpy(addr, result[j][i][t[j]].c, strlen(result[j][i][t[j]].c));
						addr += strlen(result[j][i][t[j]].c);

						++t[j];
						--size[i];
					}
					++process_id;

				}
			}
		}
		memcpy(addr, "\n", 1);
		munmap(iter, len);
	}

三、int型 转 字符串

void my_itoa(char* buf, unsigned int val)
	{
		unsigned int vals[10] = {};
		int len = 0;
		do
		{
			vals[len] = val % 10;
			val /= 10;
			++len;
		} while (val > 0);

		--len;
		char* p = buf;
		do
		{
			*p = vals[len] + '0';
			++p;
			--len;

		} while (len >= 0);
		*p = ',';
		++p;
		*p = '\0';
	}

四、unsigned int型 转 字符串(通过查询的方式)

inline void ui2S(MyContainer& a, vector<m_answer>& b, vector<uint>& c, const uint& thread_index)
	{
		c.push_back(a.base[0]);
		m_answer s_temp;
		char* p1 = s_temp.c;
		char* p2 = NULL;
		for (unsigned int i = 0; i < a.rear; ++i)
		{
			p2 = vexs[a.base[i]].id_char;///
			while (*p2 != '\0')
			{
				*p1 = *p2;
				++p1;
				++p2;
			}
		}
		*p1 = '\0';
		--p1;
		*p1 = '\n';
		answer_len[thread_index] += strlen(s_temp.c);
		b.push_back(s_temp);
	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mmap的使用 的相关文章

  • mmap的使用

    参考资料 mmap 函数 xff1a 原理与使用 含代码 mmap函数使用与实例详解 Linux系统编程 xff1a mmap使用技巧 mmap和普通文件读写的区别和比较 amp mmap的注意点 认真分析mmap xff1a 是什么 为什
  • mmap和常规文件操作的区别

    mmap和常规文件操作的区别 对linux文件系统不了解的朋友 请参阅我之前写的博文 从内核文件系统看文件读写过程 我们首先简单的回顾一下常规文件系统操作 调用read fread等类函数 中 函数的调用过程 1 进程发起读文件请求 2 内
  • 如何知道写时复制页面是否是实际副本?

    当我使用 mmap 创建写时复制映射 MAP PRIVATE 时 一旦我写入特定地址 该映射的某些页面就会被复制 在我的程序中的某个时刻 我想弄清楚哪些页面实际上已被复制 有一个称为 mincore 的调用 但它仅报告页面是否在内存中 这与
  • Linux下获取缓冲区的物理地址

    我在具有完整 MMU 的 Xilinx Microblaze 上运行 Linux 内核 3 3 我正在执行的任务要求我了解以下内容 我需要创建一个文本文件 缓冲区 并找到该缓冲区的物理地址 并且我不希望内核将此文件写入不连续的内存区域 我需
  • Solr 使用太多内存

    我们有一个在带有 Oracle Java 6 Hotspot JDK 的 Windows 2008 R2 上运行的 Solr 3 4 实例 该实例变得无响应 当我们查看机器时 我们注意到可用物理内存变为零 Tomcat7 exe 进程使用了
  • 如何为可缓存 PCIe BAR 进行 mmap

    我正在尝试编写一个自定义驱动程序mmap PCIe BAR 的函数 目标是使该 BAR 可缓存在处理器缓存中 我知道这不是实现最高带宽的最佳方法 并且写入顺序是不可预测的 本例中也不是问题 这类似于中所描述的如何阻止 MMAP 缓存值 处理
  • mmap vs sbrk,性能比较

    这些调用中哪个平均速度更快 我听说过mmap对于较小的分配来说速度更快 但我还没有听说过两者的比较 任何有关这些性能的信息都会很好 您应该使用特定的实现来标记它 例如linux 因为答案肯定会因实现而异 现在我假设Linux 因为它是最流行
  • Haskell 使用惰性 mmap 读取最后一行

    我想读取文件的最后一行 并确保它的字段数与第一行相同 我不关心中间的任何内容 我使用 mmap 是因为它对大文件的随机访问速度很快 但遇到了不理解 Haskell 或懒惰的问题 gt import qualified Data ByteSt
  • 在 64 位系统上分配低地址内存的最可靠/可移植的方法是什么?

    我需要分配位于前 32GB 虚拟地址空间内的大内存块 由我的自定义分配器使用 我想如果我需要 比如说 1MB 块 我可以使用迭代mmap and MAP FIXED NOREPLACE 或 VirtualAlloc 从低地址开始以 1MB
  • 为什么 Python 的 mmap 不能处理大文件?

    编辑 此问题仅适用于 32 位系统 如果您的计算机 操作系统和 python 实现都是 64 位的 那么 mmap ing 大文件可以可靠地工作并且非常高效 我正在编写一个模块 除其他外 它允许对文件进行按位读取访问 这些文件可能很大 数百
  • SIGBUS 同时从 mmap ed 缓冲区执行 memcpy,该缓冲区位于 RAM 中,由 mincore 识别

    我将块映射为 mapAddr mmap void 0 curMapSize PROT NONE MAP LOCKED MAP SHARED fd curMapOffset 如果这没有失败 mapAddr MAP FAILED 我查询 min
  • 从另一个进程访问 mmap 内存

    我开始玩 mmap 了 我正在尝试创建一个示例工作区 然后将其扩展到实际案例 这就是我想要实现的目标 流程1 mmap一个文件 实际上是一个设备 但是用文本文件生成一个例子是可以的 进程2 不是从进程1复制而来 只是一个独立的进程 读取进程
  • 如何可移植地扩展使用 mmap() 访问的文件

    我们正在尝试改变 SQLite 一个嵌入式数据库系统 使用 mmap 而不是通常的 read 和 write 调用来访问 磁盘上的数据库文件 对整个数据使用单个大映射 文件 假设文件足够小 我们没有问题 在虚拟内存中为此寻找空间 到目前为止
  • 写入内存映射文件后,什么会更新 mtime?

    我在 Linux 上使用 XFS 并且有一个内存映射文件 每秒写入一次 我注意到文件 mtime 由watch ls full time 周期性但不规则地变化 mtimes之间的差距似乎在2到20秒之间 但并不一致 系统上几乎没有其他东西在
  • mmap() 返回 EINVAL

    我无法获取mmap功能来工作 它返回EINVAL错误代码 void mapped mmap void map addr slide map size PROT WRITE PROT READ MAP PRIVATE MAP ANON bpr
  • 如果禁用 ASLR,mmap 是否具有确定性?

    如果地址空间布局随机化 ASLR 被禁用 我们是否会有确定性mmap 通过确定性 我的意思是 如果我使用相同的输入一次又一次地运行相同的应用程序 我会得到由mmap 我最感兴趣的是匿名地图 如果地址空间布局随机化 ASLR 被禁用 我们会有
  • Linux 上的 Python mmap“权限被拒绝”

    我有一个非常大的文件 我试图用 mmap 打开它 但它给我的权限被拒绝 我尝试过不同的标志和模式os open但它对我不起作用 我究竟做错了什么 gt gt gt import os mmap gt gt gt mfd os open Bi
  • 读取超过 2^18 字节的惰性字节串时发生段错误

    考虑以下代码 http hpaste org 90394 http hpaste org 90394 我正在将一个 460mb 的大文件内存映射到一个惰性 ByteString ByteString 报告的长度471053056 When
  • 第二次ftruncate失败

    我试图在首次成功执行 shm open 和 ftruncate 后超出共享内存对象 这是代码 char uuid GenerateUUID int fd shm open uuid O RDWR O CREAT O EXCL S IRUSR
  • 如何访问 mmaped /dev/mem 而不导致 Linux 内核崩溃?

    我有一个简单的程序 尝试访问用户空间中的物理内存 其中内核存储第一个结构页 在 64 位机器上 该地址是 内核虚拟地址 ffffea0000000000 物理地址 0000620000000000 我正在尝试通过用户空间中的 mmap 访问

随机推荐

  • 计算机网络

    文章目录 第一章 概述小结局域网 广域网 Internet网络通信 xff08 OSI模型 xff09 xff1a 计算机网络的性能指标 xff1a 第二章 物理层小结物理层的基本概念数据通信的基础知识基带与带通 xff1a 常用编码 xf
  • mysql使用和优化

    取当天0点0分 xff0c 下一天0点0分 UNIX TIMESTAMP获取时间戳 timestamp获取时间 select UNIX TIMESTAMP date sysdate timestamp adddate date sysdat
  • 数据库系统

    文章目录 第1章 概论第2章 基本知识与关系模型1 数据库 数据库管理系统 数据库系统什么是数据库什么是数据库系统什么是数据库管理系统DBMS小结 2 数据库系统的结构抽象与演变数据库系统的标准结构3 数据模型4 数据库系统的演变与发展5
  • 操作系统(学习笔记)

    文章目录 1 什么是操作系统2 操作系统的启动3 操作系统的接口4 系统调用的实现5 操作系统的历史6 我们的任务8 CPU管理9 多进程图像1 读写PCB xff0c OS中最重要的结构 xff0c 贯穿始终 2 要操作寄存器完成切换 x
  • 2020华为软挑总结

    文章目录 一 热身赛编程闯关 xff1a 评价标准 xff1a 问题分析 二 初赛问题描述评价标准 xff1a 问题分析思路一 xff1a 思路二 xff1a 思路三 xff1a 针对思路三的提速 xff1a 最终结果 xff1a 三 co
  • Linux命令总结之目录命令

    文章目录 Linux 目录命令1 96 ls 96 命令2 96 cd 96 命令3 96 pwd 96 命令4 96 mkdir 96 命令5 96 rm 96 命令6 96 mv 96 命令7 96 cp 96 命令8 96 cat 9
  • Markdown 公式指导手册

    Markdown 公式指导手册
  • Linux学习

    文章目录 一 基础入门二 Linux 命令总结一 Linux 目录命令 https blog csdn net weixin 42715287 article details 105825021 二 Linux 文件管理命令 https e
  • Linux命令总结之文件管理命令

    文章目录 二 Linux 文件管理命令1 96 which 96 命令到底什么是命令 xff1f 2 96 whereis 96 命令3 96 locate 96 命令4 96 find 96 命令5 96 xargs 96 命令 二 Li
  • Linux命令总结之文本编辑命令

    文章目录 Linux 文本编辑命令1 96 wc 96 命令2 96 grep 96 命令3 96 正则表达式 96 命令4 96 cut 96 命令5 96 paste 96 命令6 96 tr 96 命令7 96 sort 96 命令8
  • Linux命令总结之Linux 磁盘管理命令

    文章目录 Linux 磁盘管理命令1 96 df 96 命令2 96 du 96 命令3 96 time 96 命令 Linux 磁盘管理命令 1 df命令 linux 中 df 命令的功能是用来检查 linux 服务器的文件系统的磁盘空间
  • linux基础操作之一

    文章目录 1 基本概念及操作常用快捷键 xff1a 2 用户及文件权限管理1 Linux 用户管理1 查看用户 xff1a 2 创建账户 xff1a 3 用户组4 删除用户和用户组5 鲲鹏服务器安装 96 perf 96 6 阿里云服务器安
  • 重庆思庄Linux技术分享-linux中VDO的使用

    VDO xff08 Virtual Data Optimize虚拟数据优化 xff09 通过压缩或删除存储设备上的数据来优化存储空间 VDO层放置在现有块存储设备例如RAID设备或本地磁盘的顶部 这些块设备也可以是加密设备 存储层 xff0
  • 排序算法之快排

    1 快排 快速排序算法的关键在于先在数组中选一个数字 xff0c 接下来把数组中的数字分成两部分 span class token comment achieve quick sorting span span class token ma
  • 排序算法之归并排序

    充分利用了把大问题转化成一个个小的子问题的思想 xff08 由迭代或递归来实现 xff09 span class token comment achieve merge sorting span span class token macro
  • 排序算法之堆排序(附源码)

    1 将顺序存储的数据看成是一颗完全二叉树 2 对于大顶堆 xff0c 确保每棵子树的根节点都是整个子树中的最大值 xff1b 这就保证了根节点是所有数据中的最大值 xff0c 但不保证所有数据有序 span class token comm
  • LED灯源控制

    1 LED五种调光控制方式详解 LED的发光原理同传统照明不同 xff0c 是靠P N结发光 xff0c 同功率的LED光源 xff0c 因其采用的芯片不同 xff0c 电流电压参数则不同 xff0c 故其内部布线结构和电路分布也不同 xf
  • LED驱动电路的分析

    文章目录 一 方案一 1 电路工作原理 2 组件选择 3 个人分析 二 方案二 在方案一的基础上改进 1 电路工作原理 2 个人分析 三 方案三 在方案一的基础上改进 1 电路工作原理 2 个人分析 参考连接 常见驱动电路的分析 一 方案一
  • linux基础操作之二

    文章目录 6 文件解压与打包1 概念讲解2 实战1 zip 压缩打包程序2 使用 unzip 命令解压缩 zip 文件3 tar 打包工具4 总结 7 文件系统操作与磁盘管理1 查看磁盘和目录的容量2 dd 命令简介3 使用 dd 命令创建
  • mmap的使用

    参考资料 mmap 函数 xff1a 原理与使用 含代码 mmap函数使用与实例详解 Linux系统编程 xff1a mmap使用技巧 mmap和普通文件读写的区别和比较 amp mmap的注意点 认真分析mmap xff1a 是什么 为什