Linux 进程间通信:System V 共享内存
System V 共享内存是 Linux 下一种高效的进程间通信(IPC)机制。它允许多个进程直接访问同一块物理内存区域,数据无需经过内核复制,因此速度极快。
基本原理
与其他 IPC 方式不同,共享内存不需要通过系统调用在用户态和内核态之间拷贝数据。一旦内存段被映射到多个进程的地址空间,它们就可以像操作普通变量一样读写数据。

数据结构
操作系统需要管理这些共享内存段,通常使用 struct shmid_ds 结构体来记录状态和属性。其中包含键值 key、权限、大小、创建时间等信息。
注意:
key是由用户定义的标识符,而非系统自动生成。这是因为多个进程需要通过相同的 key 找到同一段共享内存。如果由系统生成,其他进程将无法得知该 key,也就无法访问。
核心函数与使用流程
实现 System V 共享内存主要涉及四个系统调用:shmget、shmat、shmdt 和 shmctl,配合 ftok 生成唯一键值。
1. 生成键值 ftok
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
ftok 将文件路径和项目 ID 转换为一个唯一的 key_t。这样,只要两个进程知道同一个文件路径和 ID,就能获得相同的 key,从而定位到同一段共享内存。
2. 创建或获取共享内存 shmget
int shmget(key_t key, size_t size, int shmflg);
key: 通过ftok生成的键值。size: 共享内存大小(字节)。shmflg: 标志位,常用IPC_CREAT(不存在则创建)和IPC_EXCL(必须新建,否则报错)。
例如,创建一个 4KB 的共享内存段:
#
std::string gpath = ;
ProcessId = ;
gsize = ;
{
key = (gpath.(), ProcessId);
shmid = (key, gsize, IPC_CREAT | IPC_EXCL | );
(shmid < ) {
std::cout << << std::endl;
;
}
std::cout << << key << << shmid << std::endl;
;
}


