POSIX标准共享内存完整接口、步骤、函数详解 POSIX共享内存完整接口、步骤、函数详解POSIX 共享内存shm_open 系列文件式共享内存挂载在 /dev/shm 临时文件系统区别于 System V 共享内存shmget/shmat 键值式。整套流程分创建打开→映射内存→读写→解除映射→关闭→删除6步逐个拆解函数。一、头文件与编译依赖#include sys/mman.h // 用到的函数mmap, munmap, msync#include sys/stat.h // mode常量#include fcntl.h // O_打开标志#include unistd.h // ftruncate, close#include shm.h // shm_open, shm_unlink编译必须加 -lrt部分新版glibc可省略兼容写法必带gcc test.c -o test -lrt二、完整操作6个步骤对应API步骤1打开/创建共享内存对象 shm_open头文件#include sys/mman.h /* For mmap, munmap*/#include sys/stat.h /* For mode constants/#include fcntl.h /For O_* constants */函数原型int shm_open(const char *name, int oflag, mode_t mode);功能打开/创建共享内存对象参数name共享内存文件名必须以 / 开头如 /shm_buf存于 /dev/shm/oflag 组合标志O_CREAT不存在则创建O_EXCL配合CREAT已存在则报错防止重复创建O_RDONLY/O_RDWR只读/读写权限mode新建时权限如 0664umask会过滤权限已存在则mode无效返回值成功返回文件描述符fd失败-1错误码写在errno。注意shm_open只创建内核对象不会分配内存大小必须下一步ftruncate定尺寸。步骤2设置共享内存大小 ftruncate头文件#include unistd.h#include sys/types.h函数原型int ftruncate(int fd, off_t length);功能设置共享内存大小即给内核共享内存对象分配磁盘页大小的物理内存参数fdshm_open返回的共享内存标识符fdlength共享内存字节大小如4096、1024*1024返回值成功返回0失败-1,错误码写在errno。步骤3将共享内存映射到进程虚拟地址 mmap核心把内核共享内存页挂载到进程用户态地址进程直接指针读写头文件#include sys/mman.h函数原型void *mmap(voidaddr, size_t length, int prot, int flags, int fd, off_t offset);参数:addr指定映射地址填NULL由内核自动分配最常用length映射字节数和ftruncate尺寸一致prot 内存保护权限不能超过shm_open打开权限PROT_READ可读PROT_WRITE可写PROT_EXEC可执行flags 映射类型共享内存必用MAP_SHARED修改同步到内核共享内存进程间可见MAP_PRIVATE私有拷贝修改不共享不能用于进程通信fd共享内存fdoffset文件偏移共享内存固定填0返回值:成功返回映射起始指针失败MAP_FAILED((void)-1),错误码写在errno。步骤4进程读写共享内存直接用mmap返回的指针操作数组/结构体即可char *p mmap(...); strcpy(p, hello shm); // 写 printf(%s, p); // 读可选msync强制同步一般MAP_SHARED自动同步刷新缓存用int msync(void *addr, size_t length, int flags); flagsMS_SYNC阻塞刷盘、MS_ASYNC异步刷新步骤5解除进程地址映射 munmap进程不再使用时断开虚拟地址绑定不会删除内核共享内存头文件#include sys/mman.h函数原型int munmap(void *addr, size_t length);参数addrmmap返回的首地址返回值:成功返回映射起始指针失败-1, 错误码写在errno。注意进程退出会自动munmap主动释放是好习惯步骤6收尾两步区分关闭fd和删除对象① close(fd) 关闭文件描述符close(fd);只是关闭当前进程的fd句柄内核共享内存依然存在其他进程还能打开使用。② shm_unlink 删除共享内存内核对象真正销毁int shm_unlink(const char *name);调用后已有映射的进程还能正常使用内存所有进程都munmapclose后内存才会被内核回收特性删除是异步的推荐服务端创建完就unlink实现匿名化共享内存避免残留文件三、关键特性避坑点名字规则全局名字只能一根斜杠不能多级目录 /shm/abc 非法生命周期内核对象不调用shm_unlink就永久存在重启系统才清空同步问题共享内存只负责数据传递不含同步锁必须配合POSIX信号量/互斥锁解决竞态页对齐mmap长度最好是4k页大小内核会向上对齐权限mmap的prot不能超过shm_open打开权限只读fd不能PROT_WRITE四、和System V共享内存核心区别特性 POSIX shm_open System V shmget标识 文件名 路径IPC键key持久化 文件形式可ls /dev/shm查看 内核标识符无实体文件销毁 shm_unlink ipcrm命令/函数删除拓展 可配合mmap、文件操作 接口老旧灵活性差