Linux 共享内存(shm)
共享内存Shared Memory是最快的进程间通信方式因为它直接让多个进程访问同一块物理内存无需数据拷贝。我会用C 语言 System V 共享内存shmget/shmat/shmdt/shmctl给你完整、可直接运行的实现方案包含核心 API 讲解写进程代码读进程代码运行与清理命令一、共享内存核心 APILinux 下共享内存标准接口c运行// 1. 创建/获取共享内存段 int shmget(key_t key, size_t size, int shmflg); // 2. 挂载共享内存到进程地址空间 void *shmat(int shmid, const void *shmaddr, int shmflg); // 3. 卸载共享内存 int shmdt(const void *shmaddr); // 4. 控制共享内存删除、获取信息 int shmctl(int shmid, int cmd, struct shmid_ds *buf);二、完整实现两个进程通信1. 写进程shm_write.c创建共享内存 → 写入数据c运行#include stdio.h #include stdlib.h #include sys/ipc.h #include sys/shm.h #include string.h // 约定的 KEY 值两个进程必须相同 #define SHM_KEY 0x1234 // 共享内存大小 #define SHM_SIZE 1024 int main() { // 1. 创建共享内存 int shmid shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666); if (shmid -1) { perror(shmget failed); exit(1); } printf(创建共享内存成功ID%d\n, shmid); // 2. 挂载到当前进程 char *shmaddr (char *)shmat(shmid, NULL, 0); if (shmaddr (void *)-1) { perror(shmat failed); exit(1); } // 3. 写入数据 const char *msg Hello, 共享内存测试; strcpy(shmaddr, msg); printf(写入数据%s\n, msg); // 4. 等待读进程读取 printf(按回车退出...\n); getchar(); // 5. 卸载共享内存 shmdt(shmaddr); return 0; }2. 读进程shm_read.c获取共享内存 → 读取数据c运行#include stdio.h #include stdlib.h #include sys/ipc.h #include sys/shm.h #include string.h #define SHM_KEY 0x1234 #define SHM_SIZE 1024 int main() { // 1. 获取已创建的共享内存 int shmid shmget(SHM_KEY, SHM_SIZE, 0666); if (shmid -1) { perror(shmget failed); exit(1); } printf(获取共享内存成功ID%d\n, shmid); // 2. 挂载 char *shmaddr (char *)shmat(shmid, NULL, 0); if (shmaddr (void *)-1) { perror(shmat failed); exit(1); } // 3. 读取并打印 printf(读取数据%s\n, shmaddr); // 4. 卸载 shmdt(shmaddr); return 0; }三、编译与运行1. 编译bash运行gcc shm_write.c -o shm_write gcc shm_read.c -o shm_read2. 运行必须先启动写进程终端 1bash运行./shm_write终端 2bash运行./shm_read你会看到写进程写入消息读进程直接读取到同一块内存的数据四、共享内存清理重要共享内存随内核存在进程退出不会自动删除查看共享内存bash运行ipcs -m删除指定共享内存bash运行ipcrm -m [shmid]一次性删除所有共享内存bash运行ipcrm --allshm五、关键说明key 值两个进程必须使用相同的 key才能找到同一块共享内存生命周期内核持续管理直到手动ipcrm删除或重启系统同步问题共享内存不带同步机制多进程同时读写会产生数据混乱实际使用需要配合信号量 / 互斥锁总结共享内存是最快的进程通信方式四步标准流程shmget→shmat→ 读写 →shmdt必须手动用ipcrm清理内存多进程并发需要信号量同步