使用mmap函数映射文件并进行读写的测试程序用C语言实现
时间: 2024-09-16 21:02:22 浏览: 89
在C语言中,可以使用`mmap()`系统调用来将整个文件映射到进程地址空间,这样可以直接通过内存操作来读写文件,而无需频繁的I/O操作。下面是一个简单的测试程序示例,它会打开一个文件,然后使用`mmap()`将其加载到内存,进行读取和写入:
```c
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#define FILE_NAME "test_file.txt"
int main() {
int fd; // 文件描述符
char *mapped_addr; // 映射后的地址
off_t length;
ssize_t read_size;
int ret;
// 打开文件
if ((fd = open(FILE_NAME, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) == -1) {
perror("Failed to open file");
return 1;
}
// 获取文件长度
lseek(fd, 0, SEEK_END);
length = ftell(fd);
lseek(fd, 0, SEEK_SET); // 重置指针
// 映射文件
if ((mapped_addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
perror("Failed to mmap file");
close(fd);
return 1;
}
printf("Mapped %zd bytes at %p\n", length, mapped_addr);
// 读取数据
for (read_size = 1; read_size <= length; read_size++) {
if ((ret = read(fd, mapped_addr, read_size)) == -1) {
perror("Reading from file failed");
break;
}
printf("Read %zd bytes: ", ret);
for (int i = 0; i < ret; i++) {
printf("%c ", mapped_addr[i]);
}
printf("\n");
}
// 写入数据
char write_data[] = "Hello, Mapped File!";
for (size_t i = 0; i < sizeof(write_data); i++) {
mapped_addr[i] = write_data[i];
}
// 修改后同步至磁盘
msync(mapped_addr, length, MS_SYNC);
// 释放映射
munmap(mapped_addr, length);
// 关闭文件
close(fd);
return 0;
}
```
这个程序首先打开一个文件,然后创建一个内存映射,并读取文件内容到内存。接着,它在内存中写入一些字符串,然后同步内存更新回磁盘,最后释放内存映射并关闭文件。
阅读全文