共享内存通过直接访问同一物理内存实现高效IPC。示例中writer.c创建并写入数据,reader.c读取数据,需注意同步、键值生成、资源清理和权限设置。

共享内存是Linux进程间通信(IPC)中效率最高的一种方式,因为它允许两个或多个进程直接访问同一块物理内存区域,避免了数据在内核与用户空间之间的多次拷贝。下面通过一个完整的示例,展示如何使用System V共享内存实现两个进程间的通信。
1. 共享内存的基本流程
使用System V共享内存通信通常包括以下步骤:
- 使用shmget()创建或获取一个共享内存段
- 使用shmat()将共享内存段附加到当前进程的地址空间
- 读写共享内存中的数据
- 使用shmdt()分离共享内存
- 使用shmctl()删除共享内存段(通常由一个进程负责清理)
2. 写入进程(writer.c)
该程序创建共享内存,写入数据,并等待读取完成。
#include#include #include #include #include #define SHM_SIZE 1024 // 共享内存大小 int main() { key_t key = ftok("shmfile", 65); // 生成键值 int shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT); // 创建共享内存 char *shmaddr = (char*)shmat(shmid, NULL, 0); // 映射到进程地址空间 printf("共享内存已创建,开始写入数据...\n"); const char *msg = "Hello from writer process!"; strcpy(shmaddr, msg); printf("数据已写入: %s\n", shmaddr); printf("等待读取进程完成...(按回车键继续)\n"); getchar(); // 分离并删除共享内存 shmdt(shmaddr); shmctl(shmid, IPC_RMID, NULL); printf("共享内存已删除。\n"); return 0; }
3. 读取进程(reader.c)
该程序连接到已存在的共享内存,读取数据并分离。
#include#include #include #include #define SHM_SIZE 1024 int main() { key_t key = ftok("shmfile", 65); int shmid = shmget(key, SHM_SIZE, 0666); // 获取已有共享内存 char *shmaddr = (char*)shmat(shmid, NULL, 0); printf("连接到共享内存,正在读取数据...\n"); printf("接收到的数据: %s\n", shmaddr); // 分离共享内存 shmdt(shmaddr); printf("已从共享内存分离。\n"); return 0; }
4. 编译与运行
将上面两个文件保存为writer.c和reader.c,然后编译:
gcc writer.c -o writergcc reader.c -o reader
运行顺序:
- 先运行写入进程:./writer,它会暂停等待输入
- 另开终端运行读取进程:./reader
- 回到第一个终端,按回车键让写入进程清理资源
5. 注意事项
- 同步问题:共享内存本身不提供同步机制,实际应用中应配合信号量或互斥锁使用,防止竞态条件
- 键值生成:ftok()依赖文件路径和id,确保文件存在且权限正确
- 资源清理:未删除的共享内存会驻留内核,可用ipcs -m查看,ipcrm -m [shmid]手动清除
- 权限设置:shmget()中的权限位如0666表示所有用户可读写










