代码实现思路
- 打开文件:使用
open
函数打开目标文本文件,获取文件描述符。
- 获取文件大小:使用
lseek
函数结合SEEK_END
定位到文件末尾,再通过ftell
获取文件大小(也可以使用stat
函数获取文件大小信息)。
- 内存映射:调用
mmap
函数将文件映射到内存,得到一个指向映射内存区域的指针。
- 读取数据:从映射内存区域读取前100个字节的数据(需判断文件大小是否大于等于100字节)。
- 打印数据:使用
write
函数将读取的数据打印到终端。
- 解除映射:调用
munmap
函数解除内存映射。
- 关闭文件:使用
close
函数关闭文件描述符。
需要注意的要点
- 文件打开权限:确保以合适的权限打开文件,例如只读权限
O_RDONLY
。
- 错误处理:对
open
、mmap
、munmap
、close
等函数的返回值进行检查,及时处理错误情况。
- 文件大小判断:在读取前100个字节时,要判断文件实际大小是否足够,避免越界访问。
- 内存映射参数:
mmap
函数的参数需正确设置,包括映射的起始地址(通常设为NULL
让系统自动分配)、映射长度、保护权限、映射标志等。
- 解除映射与关闭文件:确保在使用完映射内存和文件后,正确调用
munmap
和close
函数,避免资源泄漏。
示例代码(简化版,未全面处理错误)
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
int fd = open("test.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
struct stat sb;
if (fstat(fd, &sb) == -1) {
perror("fstat");
close(fd);
return 1;
}
size_t length = sb.st_size;
if (length < 100) {
length = length;
} else {
length = 100;
}
char *map = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0);
if (map == MAP_FAILED) {
perror("mmap");
close(fd);
return 1;
}
write(STDOUT_FILENO, map, length);
if (munmap(map, length) == -1) {
perror("munmap");
}
close(fd);
return 0;
}