mmap创建映射区,提示mmap:invalid argument!
我的原因是,
txt文件大小0,报错。
txt文件必须。必须要有实际大小。
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
int main()
{
int fd = open("mmap_test.txt", O_RDWR);// 打开一个文件
int len = lseek(fd, 0, SEEK_END);//获取文件大小
// 创建内存映射区
void *ptr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
{
perror("mmap error");
exit(1);
}
close(fd); //关闭文件
// 创建子进程
pid_t pid = fork();
if (pid == 0) //子进程
{
sleep(1); //演示,保证父进程先执行
// 读数据
printf("%s\n", (char*)ptr);
}
else if (pid > 0) //父进程
{
// 写数据
strcpy((char*)ptr, "i am u father!!");
// 回收子进程资源
wait(NULL);
}
// 释放内存映射区
int ret = munmap(ptr, len);
if (ret == -1)
{
perror("munmap error");
exit(1);
}
}
测试:
当txt文件为空时
当填进去一个字符时:
/
最后:mmap注意事项:
- 注意事项
- 1) 创建映射区的过程中,隐含着一次对映射文件的读操作。
- 2) 当MAP_SHARED时,要求:映射区的权限应 <=文件打开的权限(出于对映射区的保护)。而MAP_PRIVATE则无所谓,因为mmap中的权限是对内存的限制。
- 3) 映射区的释放与文件关闭无关。只要映射建立成功,文件可以立即关闭。
- 4) 特别注意,当映射文件大小为0时,不能创建映射区。所以,用于映射的文件必须要有实际大小。mmap使用时常常会出现总线错误,通常是由于共享文件存储空间大小引起的。
- 5) munmap传入的地址一定是mmap的返回地址。坚决杜绝指针++操作。
- 6) 如果文件偏移量必须为4K的整数倍。
- 7) mmap创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。