注意事项

如果对 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 什么情况下会调用失败?

第一关参数:lenght=0第三个参数:prot

只指定写权限prot PROT_READ | PROT_WRITE 第5 个参数 fd,通过open 函数指定 O_RDONLY / O_WRONLY。 可以用 open 的时候 O_CREAT 一个新文件来创建映射区?

可以的,但是创建的文件的大小如果为 0 的话,会报错可以对新的文件进行扩展,产生黑洞文件

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;

}

查看原文