mmap函数
将存储空间与内存中映射,修改内存
caddr_t mmap(caddr_t addr, size_t len,int prot,int flag, int fd,off_t offset): 成功返回隐社区起始地址,失败返回-1
* caddr_t 通常就是char *, 这个参数指定内存起始地址,设置成0代表让系统来选
* len 代表映射区多大
* prot 安全方面
PROT_EXEC //页内容可以被执行
PROT_READ //页内容可以被读取
PROT_WRITE //页可以被写入
PROT_NONE //页不可访问
- flag 选项
MAP_FIXED :必须使用指定的映射起始地址(默认系统只把这个参数当做建议),用这个参数对可移植性不利
MAP_SHARED :对映射区域的写入数据会同步到文件中(由内核决定什么时候同步)
MAP_PRIVATE :创建映射文件的副本。之后对该映射区域的读写都是存访该副本。
- fd 文件句柄
- offset 映射区的偏移量,通常是0
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
main()
{
int fd = open("./file",O_RDWR);
struct stat f_stat;
fstat(fd,&f_stat);
printf("File size:%d\n",f_stat.st_size);
char *mmap_addr;
mmap_addr = (char *) mmap(0,f_stat.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
printf("File data:%s",mmap_addr);
*(mmap_addr) = 'x';
*(mmap_addr + 1) = 'x';
printf("File data:%s",mmap_addr);
}
int munmap(caddr_t addr,size_t len): 去除映射区,不会促使系统同步文件,成功返回0,失败返回-1
int msync(const void *addr, size_t len, int flags): 强制同步文件
* flag
MS_ASYNC : 立刻返回
MS_SYNC : 同步好以后再返回
MS_INVALIDATE : 使得文件的其他映射失效,从而使得共享该文件的其他进程去重新获取最新值
作为父子进程的共享内存
- 利用/dev/zero文件,因为它是一个无限个0的文件,同时接收并忽略所有写向它的数据
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
main()
{
int fd = open("/dev/zero",O_RDWR);
char *mmap_addr;
mmap_addr = (char *) mmap(0,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
int pid = fork();
if(pid == 0)
{
while(1==1)
{
(*mmap_addr)++;
sleep(1);
}
} else {
while(1==1)
{
printf("%d\n",*mmap_addr);
sleep(1);
}
}
}