==========共享内存=============
1)操作步骤
(1)使用ftok函数获取键值
(2)使用shmget函数获取共享内存ID
(3)使用shmat函数将共享内存映射至本进程虚拟内存空间的某个区域
(4)不再使用时使用shmdt解除映射关系
(5)当没有进程需要使用这块内存时使用shmctl函数删除他
key_t ftok(路径,号码);//key
int shmget(key_t key, size_t size, int shmflg); //shmid
key --->共享内存的键值
size --->共享内存的大小(PAGE_SIZE的整数倍) //1024
shmflg --->IPC_CREAT --->如果key对应的共享内存不存在,就创建
IPC_EXCL --->如果该key对应的额共享内存已经存在,就报错
SHM_HUGETLB --->使用"大页面"来分配共享内存
SHM_NORESERVE --->不在交换分区中为这块共享内存保留空间
mode --->共享内存的访问权限(如0664)
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid --->共享内存的ID
shmaddr --->如果写为NULL,系统会自动选择一个合适的虚拟内存空间地址去映射共享内存,一般选择写NULL
如果不为NULL,系统会根据shmaddr来选择一个合适的内存区域,不为NULL时SHM_RND必须设置
shmflg --->SHM_RDONLY --->以只读方式映射共享内存
SHM_REMAP --->重新映射,此时shmaddr不能为NULL
SHM_RND --->自动选择比shmaddr小的最大页对齐地址
0 --->可读可写的方式映射共享内存
int shmdt(const void *shmaddr);
将共享内存从当前进程解除映射,之后进程不能再允许访问SHM
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
shmid --->共享内存的ID
cmd --->IPC_STAT --->获取属性信息,放置在buf中
IPC_SET --->设置属性信息为buf指向的内容
IPC_RMID --->将共享内存标记为"即将被删除"状态
IPC_INFO --->获得关于共享内存的系统限值信息
SHM_INFO --->获得系统为共享内存消耗的资源信息
SHM_STAT --->同IPC_STAT,但shmid为该SHM在内核中记录所有SHM信息的数组的下标
因此用过迭代所有的下标可以获得系统所有SHM的相关信息
SHM_LOCK --->禁止系统将该SHM交换至swap分区
SHM_UNLOCK --->允许系统将该SHM交换至swap分区
buf --->属性信息的结构体指针,不需要就设置为NULL
返回值
成功 --->
IPC_INFO --->内核中记录所有SHM信息的数组的下标最大值
SHM_INFO --->内核中记录所有SHM信息的数组的下标最大值
SHM_STAT --->下标值为shmid的SHM的ID
失败 --->-1
功能
获取或者设置共享内存的相关属性
共享内存函数
于 2024-02-08 22:08:01 首次发布