为什么要建微网站,爱站网ip反域名查询,wordpress悬浮联系表,计算机类专业哪个好创建内存映射区#xff1a;
void *mmap(void *addr ,size_t length,int prot,int flags,int fd,off_t offset);
参数#xff1a;
addr 指定映射区的首地址。通常NULL#xff0c;表示让系统自动分配length 共享内存映射区的长度prot 共享内存的读写属性 PROT_READ PR…创建内存映射区
void *mmap(void *addr ,size_t length,int prot,int flags,int fd,off_t offset);
参数
addr 指定映射区的首地址。通常NULL表示让系统自动分配length 共享内存映射区的长度prot 共享内存的读写属性 PROT_READ PROT_WRITE flags 标注共享内存的共享属性 MAP_SHARED MAP_PRIVATEfd 用于创建共享内存映射区的那个文件的文件描述符offset 默认为0 表示映射文件全部 偏移位置 需是4k的整数倍
返回值
成功映射区的首地址失败MAP_FAILED(void*(-1)),error
int munmap(void *addr,size_t length) 释放映射区 addr mmap的返回值 length 大小 实验结果 *p是共享内存 两者一致 那为什么全局变量var的值不一样呢 因为两个进程所占的内存相互独立所以子进程只改变了自己内存中的var值 读时共享写时复制 读的时候读取共享内存写的时候复制共享内存 此时flags的状态是MAP_PRIVATE所以内存对互相都是私有 子进程改变*p父进程不会受影响 var同上
代码
#include stdio.h
#include stdlib.h
#include unistd.h
#include fcntl.h
#include sys/mman.h
#include sys/wait.hint var100;int main(){int *p;pid_t pid;int fd;fdopen(temp,O_RDWR|O_CREAT|O_TRUNC,0664);if(fd0){perror(open error);exit(1);}unlink(temp);ftruncate(fd,4);//p(int *)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);p(int *)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0);if(pMAP_FAILED){ //注意不是pNULLperror(mmap error);exit(1);}close(fd); //映射区建立完毕即可关闭文件pidfork(); // 创建子进程if(pid0){*p2000; //写共享内存var1000;printf(child,*p%d,var%d\n,*p,var);}else{sleep(1);printf(parent,*p%d,var%d\n,*p,var);wait(NULL);int retmunmap(p,4); //释放映射区if(ret-1){perror(munmap error);exit(1);}}return 0;
}