共享内存函数原型:
void* mmap(void*addr,size_t length,int prot,int flags,int fd,off_t offset);
第一个参数addr:一般为NULL
第二个参数length:需要申请的空间长度
第三个参数prot:PROT_READ , PROT_WRITE,PROT_EXEC,PROT_NONE
PROT_EXEC表示映射的这一段可执行,例如映射共享库
PROT_READ表示映射的这一段可读
PROT_WRITE表示映射的这一段可写
PROT_NONE表示映射的这一段不可访问
第四个参数flags:MAP_SHARED , MAP_PRIVATE来设置文件是共享的还是私有的
第五个参数fd:想要共享的文件描述符
第六个参数offset:一般为0
通过一个实例来具体看一下这个函数的使用
//读代码
#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/mman.h>
struct stu
{
int i;
};
int main()
{
struct stu*addr;
int fd;
fd = open("hello",O_RDWR);
if(fd < 0)
{
perror("open");
_exit(1);
}
addr = mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
unlink("hello");//共享以后删除创建的函数
while(1)
{
printf("%d\n",addr->i);//不停的打印数据
sleep(1);
}
munmap(addr,100);//取消共享
return 0;
}
//写代码
#include<fcntl.h>
#include<sys/mman.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
struct stu
{
int i;
};
int main()
{
struct stu*addr;
int fd;
fd = open("hello",O_RDWR | O_CREAT,777);
if(fd < 0)
{
perror("open");
_exit(1);
}
//增加新创建文件的大小,必须要进行一次write操作lseek才会生效
lseek(fd,99,SEEK_SET);
write(fd," ",1);
addr = mmap(NULL,100,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
while(1)
{
addr->i++;
sleep(1);
}
munmap(addr,100);
return 0;
}
运行结果:
让写进程在后台不停的进行+1的操作,读进程不停的进行读取。