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的使用 的相关文章

随机推荐

  • 计算机网络

    文章目录 第一章 概述小结局域网 广域网 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 是什么 为什