mmap内存映射写入txt文件

mmap内存映射写入txt文件

内存映射写入应该是一个比较简单的操作,网上也有线程的例子,不过我自己在使用时碰到了一点小问题,所以总结了下,有相似情况的小伙伴们可以参考下哈。另外贴一篇别人的博客,写得很详细,刚接触的可以看下链接: 传送门.
基本的做法,网上有例子,如下

#include 
#include 
#include 
#include 
#include 
#include
using namespace std;
int main() {
	char data[] = "test_data";
	int len = strlen(data);
	int fd = open("test.txt", O_RDWR | O_CREAT, 00777);	// 不存在则创建
	lseek(fd, len - 1, SEEK_END);		// 定义空文件长度
	write(fd, "", 1);					// 文件最后写入一个空字符
	char *buffer = (char *) mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	close(fd);
	memcpy(buffer, data, len);
	munmap(buffer, len);
	}	

我碰到的问题是当使用了头文件后,原来的代码莫名出现了一堆错误,而去掉这个头文件则完全没问题。而lseek()和close()两个函数都需要这个头文件,所以想到用fseek,应该也可以。
open()打开文件的返回值是一个整形,代表着进程号,而fopen则是一个File指针,这两个可以相互转化。

int main() {
	char data[] = "test_data";
	int len = strlen(data);
	FILE *fp = fopen("test.txt", "wb");	
 	int fd = fileno(fp);
	fseek(fp, len - 1, SEEK_END);
	fwrite("", sizeof(char), 1, fp);
	char *buffer = (char *)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	fclose(fp);
	memcpy(buffer, data, len);
	munmap(buffer, len);
	}

用fopen打开,然后转为fd进行内存映射,不过报了Segmentation fault (core dumped)的错误,所以再换一下思路。

int main() {
	char data[] = "phzphz\nphzphz";
	int len = strlen(data);
	int fd = open("test.txt", O_RDWR | O_CREAT, 00777);
 	FILE *fp = fdopen(fd, "wb");
	fseek(fp, len - 1, SEEK_END);
	fwrite("", sizeof(char), 1, fp);
	char *buffer = (char *)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	fclose(fp);
	memcpy(buffer, data, len);
	munmap(buffer, len);
	}

然后接可以了,虽然麻烦了点,但是至少可以用了,写入几百M的数据比fwrite快一些。

你可能感兴趣的:(c++)