共享内存
创建共享内存
key_t ftok(const char *pathname, int proj_id);
使用相同的pathname和proj_id可以得到相同的key_t
int shmget(key_t key, size_t size, int shmflg);
需要使用ftok获取key_t
IPC_CREAT——不存在就创建,存在就获取
IPC_EXCL——一般和IPC_CREAT组合使用。不存在创建,存在错误返回;保证了共享内存是最新的
size
最好是4096
的整数倍
错误代码
int shmid=shmget(key,4096,IPC_CREAT);
int shmid=shmget(key,4096,IPC_CREAT|0644);
创建共享内存也是需要权限的,如果不给权限,能创建出来,但是在链接的时候会失败
挂接
void *shmat(int shmid, const void *shmaddr, int shmflg);
// char* shm_block =(char*)shmat(shmid,nullptr,0);
// if(*(int*)shm_block==-1)
// {
// puts("不接受链接");
// exit(-1);
// }
// puts("链接共享内存");
标识将shmid进行挂接,
挂接位置,挂接方式为默认
解除挂接
int shmdt(const void *shmaddr);
删除共享内存
一共有3种选项,这里就说两种方法
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmctl(shmid, IPC_RMID, nullptr);
删除不需要属性
获取属性
struct shmid_ds ds;shmctl(shmid,IPC_STAT,&ds);std::cout<<ToHex(ds.shm_perm.__key)<<std::endl; // key
获取属性需要在
创建成功之后和释放成功之前
获取
删除
- key:表示共享内存的key
- shmid:表示共享内存编号
- owner:表示创建共享内存的用户
- perms:表示共享内存的的使用权限
- bytes:表示共享内存的大小
- nattch:表示连接到共享内存的的进程数
- status:表示共享的状态(不显示则为正常使用,显示“dest”表示共享内存已被删除,但仍有用户使用)
ipcs -m
查看所有共享内存
ipcrm -m shmid
=unlink + 管道名
key 旨在内核中标识shm的唯一性
shmid 用户使用;类似于fd(编号)
注意
共享内存不提供同步机制,需要控制控制同步——管道
system_v参考