Linux 共享内存 API 的基本用法。
struct shmid_ds
1 | struct shmid_ds { |
shmget()函数
1 |
|
函数shmget()返回与key相联系的共享内存标识符,或者在key为IPC_PRIVATE或与key相关联的共享内存不存在且shmflg中指定了IPC_CREAT时创建新的共享内存。新创
建的共享内存的内容会被初始化为 0. size会被扩展为PAGE_SIZE的整数倍。
在我使用这个函数的时候,因为在使用函数ftok()生成 key 时使用的文件路径所指向的
文件权限问题,出现了permission denied的情况,需要注意一下。
shmctl()函数
1 |
|
函数shmctl()根据参数cmd对共享内存进行控制或获取信息。
shmat()和shmdt()函数
1 |
|
函数shmat()把由shmid标识的共享内存映射(attach)到地址shmaddr,shmaddr可以
为NULL,此时系统会自己选取一个合适的地址进行映射,如果自己指定地址,则需要地址
与页对齐,或者在参数shmflg中指定SHM_RND,此时系统会自动对地址进行舍入。shmflg用来指定映射方式,除了SHM_RND之外还有SHM_EXEC SHM_RDONLY等选项。
函数shmdt则是将已经映射的内存取消映射(detach)。参数shmaddr应该与函数shmat()的返回值相同。程序退出时,共享内存也会自动取消映射(但不会自动消失)。
以下是一个示例程序:
1 |
|
注意
创建的共享内存不会自动消失,需要在程序中使用函数shmctl()将其删除(示例程序中已
使用此方法进行删除),或使用命令ipcrm -m <shmid>进行清理。
References
shmget()–Get ID of Shared Memory Segment with Key - IBM Knowledge Center