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