mmap
的返回值(ptr
)做++操作 (ptr++
),munmap
是否能成功?void *ptr=mmap(...)
ptr++; 可以对其进行 ++操作
munmap(ptr,len); // 错误,要保存地址
如果 open
时 O_RDONLY
,mmap
时 prot
参数指定PROT_READ | PROT_WRITE
会怎么样?
产生错误,返回 MAP_FAILED
open()
函数中的权限建议和 prot 参数的权限保持一致。
如果文件偏移量为 1000 会怎么样?
会错误,偏移量必须为 页 的整数倍(4k)。
mmap
什么情况下会调用失败?
prot PROT_READ | PROT_WRITE
O_RDONLY / O_WRONLY
。可以用 open
的时候 O_CREAT
一个新文件来创建映射区?
lseek()
truncate()
mmap
后关闭文件描述符,对 mmao
映射有没有影响?
没有影响,创建映射区的fd被关闭,没有任何影响。
#include
#include
#include
#include
#include
#include
#include
#include
/**
* void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
- addr :起始地址,NULL 要内核寻找合适的地址
- length :内容长度
- prot :权限,需要与文件 fd 的权限相同
- PROT_EXEC 页可执行的
- PROT_READ 页可读
- PROT_WRITE 页可写
- PROT_NONE 页不可访问
- flags :指定映射对象的类型,映射选项和映射页是否可以共享。
- MAP_SHARED 与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。
- MAP_PRIVATE 建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。
- fd :映射的磁盘文件
- offset :被映射对象内容的起点 以页为单位,32位操作系统中,一页为 4k,即 4096 字节。
*/
int main(){
int fd=open("a.txt",O_RDWR);
if(fd==-1){
printf("create not succ...");
}
off_t l=lseek(fd,100,SEEK_SET);
write(fd," ",1);
void* addr=mmap(NULL,l,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
if(addr==MAP_FAILED){
perror("mmap");
exit(0);
}
char buf[]="hello world!";
memcpy(addr,buf,strlen(buf));
int k=munmap(addr,l);
return 0;
}