/*mmap函数 作用:将文件或设备空间映射到共享内存区
void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
参数
addr:要映射的起始地址。通常指定为NULL,让内核自动选择
len:映射到进程地址空间的字节数
prot:映射区保护方式
PROT_READ/页面可读
PROT_WRITE/页面可写
PROC_EXEC/页面可执行
PROT_NONE/页面不可访问
flags:标志
MAP_SHARED/变动是共享的
MAP_PRIVATE/变动是私有的
MAP_FIXED/准确解释addr参数
MAP_ANONYMOUS/建立匿名映射区,不涉及文件
fd:文件描述符
offset:从文件头开始的偏移量
返回值:成功返回映射到内存区的起始地址;失败返回-1
*/
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
typedef struct stu
{
char name[4];
int age;
}STU;
int main(int argc, char *argv[])
{
if(argc != 2){
fprintf(stderr,"Usage:%s <file>\n", argv[0]);
eixt(EXIT_FAILURE);
}
int fd;
fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0666);
if(fd == -1)
{
ERR_EXIT("open");
}
lseek(fd, sizeof(STU)*5-1, SEEK_SET);
write(fd, "", 1);
STU *p;
p = mmap(NULL, sizeof(STU)*5, PROT_READ | PROT_WRITE, MAP_SHARED,fd, 0);
if( p==NULL)
ERR_EXIT("mmap");
char ch = 'a';
int i;
for(i=0;i<5;i++)
{
//向内存中写入,就像向写到文件中一样
memcpy((p+i)->name, &ch, 1);//将数据拷贝到内存中
(p+i)->age = 20+i;
ch++;
}
printf("initialize over\n");
munmap(p, sizeof(STU)*5);//取消建立的映射
printf("exit\n");
return 0;
}
共享内存mmap函数
最新推荐文章于 2024-01-16 15:06:57 发布