
共享内存就是在内存里开辟一块公共空间多个进程可以同时映射到自己的虚拟地址空间大家直接读写同一块物理内存。是Linux 进程间通信 IPC 最快的一种方式。1️⃣创建共享内存空间2️⃣映射到自己的进程3️⃣strcpy写数据4️⃣断开与共享内存的连接5️⃣干掉共享内存核心原理内核在物理内存中创建一块内存区域多个进程把这块内存映射挂载到自己的进程地址空间进程直接用指针读写这块内存不用拷贝、不用系统调用中转数据无需在内核和用户态来回复制所以速度最快优点速度最快无数据拷贝直接内存访问适合大批量数据传输多个进程可读可写双向通信缺点不自带同步机制没有锁、没有等待通知多个进程同时写会数据错乱需要自己配合信号量、管道、消息队列做同步互斥#include sys/shm.h创建或获取一个共享内存成功返回共享内存ID失败返回-1int shmget key_t key, size_t size, int flagkey共享内存的键值相当于 “共享内存的名字”多个进程通过同一个key就能找到同一块共享内存。可以用IPC_PRIVATE创建一个仅当前进程可用的私有共享内存。size共享内存段的大小单位是字节通常需要按页大小对齐比如 4KB。flag创建 / 获取模式包含权限位和控制选项IPC_CREAT如果共享内存不存在则创建存在则直接获取。IPC_EXCL和IPC_CREAT配合使用只有当共享内存不存在时才创建否则报错。权限位比如0666表示所有用户都有读写权限。连接共享内存到当前进程的地址空间成功返回指向共享内存的指针失败返回-1void *shmat int shm_id, const void *addr,int flagaddrshmat返回的共享内存地址指针。/ 断开与共享内存的连接成功返回0失败返回-1int shmat void *addr作用把共享内存段 “挂载” 到当前进程的虚拟地址空间让进程可以像访问普通内存一样读写这块共享内存。参数说明shm_idshmget返回的共享内存 ID。addr指定共享内存映射到进程地址空间的起始地址一般填NULL让系统自动选择合适的地址。flag映射模式常用选项0默认读写模式进程可以读写共享内存。SHM_RDONLY只读模式进程只能读取共享内存。控制共享内存的相关信息成功返回0失败返回-1int shmct1int shm_id, int cmd, struct shmid_ds *bouf作用对共享内存段执行控制操作比如查看状态、修改权限、删除共享内存。参数说明shm_id共享内存 ID。cmd控制命令常用选项IPC_STAT获取共享内存的状态信息存入buf指向的shmid_ds结构体。IPC_SET修改共享内存的权限、所有者等信息从buf结构体读取配置。IPC_RMID标记共享内存段为删除状态当所有进程都断开连接后系统会真正释放这块内存。bufshmid_ds结构体指针用于存放或传递共享内存的配置信息IPC_RMID时可以填NULL。返回值成功返回0失败返回-1并设置errno。ipcs -m 可以查看系统中有哪些共享内存删除共享内存。ipcrm -m 加id号下节学信号及信号量