IPC对象学习——共享内存
(1)描述
(1)IPC对象包括:
共享内存、消息队列、信号灯集
(2)每个IPC对象都有唯一的ID值——key
(3)IPC对象创建后,直到进程结束,系统会默认释放(在服务器上可能不行),当然人为撤销最好
(4)每个 IPC 对象都有对应的 key值 ,当key为 0 时,表示为 私有的共享内存,否则key 和 ID 对应相同
查看IPC对象:
ipcs
删除IPC对象:ipcrm
(2)特点
生成key值 ftok函数
I 节点的编号和 proj_id 低 8位组合 为 ftok 生成的 key值
key_t key;
key_t ftok(const char *pathname, int proj_id);
- pathname : 为共享内存设置的路径
(3)共享内存使用步奏
- 创建 / 打开共享内存
- 映射共享内存 (把指定的共享内存映射到进程的地址空间中,用于访问)
- 读写共享内存
- 撤销共享内存映射
- 删除共享内存的对象
1.shmget函数创建共享内存
int shmget(key_t key, size_t size, int shmflg);
私有共享内存肯定是新创的
- key 为 当创建私有共享内存时 key=0(IPC_PRIVATE),其他情况可用 ftok 创建
key值
- size : 共享内存大小 ,在系统中是有限制大小的
- shmflg :共享内存标志位,读写权限 (0为可读写)
2.shmat 映射
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid 即为申请的共享内存id。
shmaddr 如果设置为 0(NULL)将会由内核自动分配地址(推荐使用)
flg 如果配置为SHM_RDONLY将会设置为只读,否则会设置为读写 0666
3.shmdt 撤销映射
void *shmat(int shmid, const void *shmaddr, int shmflg); // 映射
int shmdt(const void *shmaddr); // 撤销映射
shmaddr: 参数为共享内存的地址。作用是解除挂解进程,释放共享内存空间
4.shmctl 删除共享内存对象
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid 为共享内存的id号
cmd 有IPC_STAT、IPC_SET、IPC_RMID , 在解除挂载的时候使用IPC_RMID 标记为消除共享内存就好了
buf 用于存放各种信息,不关心这些信息的话直接写0或者NULL就好
IPC_SET 为 设置属性,IPC_STAT 为设置共享内存属性存放结构体中
删除共享内存为
: 首先第一个进程开始创建,直到最后一个进程执行完毕,此时进行消除(nattach
表示进程使用该共享内存的个数,进程多使用一个就 + 1,用IPC_RMID 则理解为减 1 ,到0表示共享内存消除 )
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68435.html