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