Linux的共享内存及内存映射
3.用mmap 眏射到进程空间当中某一个地址上 void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); start是表示开始映射的物理地址,如果为NULL表示由内核自行选择合适空间来分配。 length是内存的大小,一般是和第二步的同一大小。 prot 是共享内存属性。它有如下值 PROT_EXEC 分配空间可执行 PROT_READ 分配空间可读 PROT_WRITE 可写 PROT_NONE 禁止访问,一般为省事,都设为 PROT_READ|PROT_WRITE flags 是共享内存的标志位,它有如下取值 MAP_FIXED ,内存固定大小,不能超过一页。如果超过将mmap失败. MAP_SHARED ,在多个进程间共享这一内存 MAP_PRIVATE, 只供本进程使用。 fd 是shm_open或open创建文件的描述符. offset 是在共享内存或文件中的偏移量。一般是0 如果映射成功,将会返回一个进程内部地址。对这个地址访问即是对内核共享内存的访问。这个地址位于堆和栈的空闲区。 如果失败,将返回MAP_FAILED (它等于 (void *)-1) 到mmap后,对共享内存的操作就跟与普通内存没有什么区别了。如使用memcpy/memset等操作. 如果结束的对共享内存使用,即可采用接下两步. int munmap(void *start, size_t length); start是映射的进程内地址,lenght是内存的长度 如果映射是文件,它还有存盘功能。 5.从内核清除共享内存 int shm_unlink(const char *name); name是共享内存名字,如果有多个进程打开这个内存,只有最后使用进程调用shm_unlink,这个共享内存才会真正清除掉。 (编辑:源码门户网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |