1.mmap函数
\qquad
返回值:成功时,返回创建的映射区首地址;失败时,返回宏MAP_FAILED
。
\qquad
参数:
\qquad
\quad
第一个参数addr
:建立映射区的首地址,有linux内核指定,使用时,直接传入NULL
;
\qquad
\quad
第二个参数length
:建立的映射区的大小;
\qquad
\quad
第三个参数prot
:映射区的权限PROT_READ
,PROT_WRITE
,PROT_READ|PROT_WRITE
;
\qquad
\quad
第四个参数flags
:标志位参数,MAP_SHARED
:会将映射区所做的操作反映到物理设备(磁盘)上;MAP_PRIVATE
:映射区所做的操作不会反映到物理设备上。
\qquad
\quad
第五个参数fd
:用来建立映射区的文件描述符
\qquad
\quad
第六个参数offset
:映射文件的偏移(4k的整数倍)
2.mmap的代码举例
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/mman.h>
#include<unistd.h>
int main()
{
int open_fd;
open_fd = open("m.txt",O_RDWR|O_CREAT,0777);
if(open_fd==-1){
perror("m open fail");
exit(1);
}
char* p = NULL;
int ftruncate_fd;
ftruncate_fd = ftruncate(open_fd,1024);
if(ftruncate_fd==-1){
perror("ftruncate fail");
exit(1);
}
p = mmap(NULL,1024,PROT_READ|PROT_WRITE,MAP_SHARED,open_fd,0);
if(p==MAP_FAILED){
perror("mmap fail");
exit(1);
}
strcpy(p,"hello world!\n");
int close_mmap_fd;
int close_fd;
close_mmap_fd = munmap(p,1024);
if(close_mmap_fd==-1){
perror("close mmap fail");
exit(1);
}
close_fd = close(open_fd);
if(close_fd==-1){
perror("m close fail");
exit(1);
}
return 0;
}