开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:Shmctl 共享内存控制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11055
Shmctl 共享内存控制
内容介绍:
一、共享内存控制
二、实例
一、共享内存控制
1.格式
#include <sys/ipc.h>
#include <sys/shm. h>
int shmctl(int shmid, int cmd,struct shmid_ds *buf);
2.功能:
共享内存空间的控制。
3.参数:
(1)shmid:共享内存标识符。
(2)buf: shmid ds 数据类型的地址,用来存放或修改共享内存的属性。
(3)cmd:函数功能的控制
IPC_RMID:删除。
IPC_SET:设置 shmid _ds 参数。IPC_STAT:保存 shmid_ds 参数。
SHM_LOCK:锁定共享内存段(超级用户)。
在物理内存中开辟了一块内存,如果某一块内存块长期不使用,这一块共享内存块会备份在磁盘上,这块共享内存可以重复利用,当用到这块内存块时,会被找回,这样可以提高物理内存的使用率.
SHM_UNLOCK:解锁共享内存段。
一旦被 LOCK ,不会被磁盘备份然后被重复利用,一直占用物理内存,直到删除或重启系统该共享内存块才会消失.
4.返回值:
成功返回0,失败返回-1。
5.注意:
共享内存块不会因为程序结束而消失
二、实例
key_ t key; //定义一个变量 key
int shm_id; //定义一个 id
char *str; //定义一个指针用于映射
int ret;
key=ftok(“.”,2); //传入参数
shm_id=shmget(key,100,IPC_CREAT|0666);
//100为共享内存块的大小
str = (char *)shmat(shm.id,NULL,0);
ret = shmdt(str);
//解除映射关系,一旦解除就不能通过指针去访问共享内存
shmctl(shm_id,IPC_RMTD,NULL);
//将共享内存块删除(保证不再使用该共享内存块)
如果想保存内存块的属性:
将 shmctl(shm_id,IPC_RMTD,NULL);
改为:
shmctl(shm_id,IPC_RMID,&tmp);
想设置共享内存块的属性:
则改为:
shmctl(shm_id,IPC_&SET,&tmp);