POSIX 为创建、映射、同步和取消共享内存段提供五个入口点:
shm_unlink()
:根据(shm_open()
返回的)文件描述符,删除共享内存段。实际上,这个内存段直到访问它的所有进程都退出时才会删除,这与在 UNIX 中删除文件很相似。但是,调用 shm_unlink()
(通常由原来创建共享内存段的进程调用)之后,其他进程就无法访问这个内存段了。mmap()
:把共享内存段映射到进程的内存。这个系统调用需要 shm_open()
返回的文件描述符,它返回指向内存的指针。(在某些情况下,还可以把一般文件或另一个设备的文件描述符映射到内存。对这些操作的讨论超出了本文的范围;具体方法请查阅操作系统的 mmap()
文档。)munmap()
:作用与 mmap()
相反。msync()
:用来让共享内存段与文件系统同步 — 当把文件映射到内存时,这种技术有用。#include <iostream> #include <sys/mman.h> #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> using namespace std; int main(int argc, char *argv[]) { const char *name = "shm_name"; int fd = shm_open(name, O_CREAT|O_RDWR, 0666); if(fd < 0) { fprintf(stderr, "shm_open\n"); return -1; } ftruncate(fd, 100); char *ptr = (char*)mmap(0, 100, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if(ptr == NULL) { fprintf(stderr, "mmap\n"); return -1; } strcpy(ptr, "hahahaha"); munmap(ptr, strlen(ptr)); return 0; }g++ shareserv.cpp -o shareserv -lrt
#include <iostream> #include <sys/mman.h> #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> using namespace std; int main(int argc, char *argv[]) { const char *name = "shm_name"; int fd = shm_open(name, O_CREAT|O_RDWR, 0666); if(fd < 0) { fprintf(stderr, "shm_open\n"); return -1; } ftruncate(fd, 100); char *ptr = (char*)mmap(0, 100, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if(ptr == NULL) { fprintf(stderr, "mmap\n"); return -1; } printf("%s\n", ptr); munmap(ptr, strlen(ptr)); return 0; }g++ sharecli.cpp -o sharecli -lrt