Linux IPC对象——共享内存

导读:本篇文章讲解 Linux IPC对象——共享内存,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

(1)描述

(1)IPC对象包括: 共享内存、消息队列、信号灯集
(2)每个IPC对象都有唯一的ID值——key
(3)IPC对象创建后,直到进程结束,系统会默认释放(在服务器上可能不行),当然人为撤销最好
(4)每个 IPC 对象都有对应的 key值 ,当key为 0 时,表示为 私有的共享内存,否则key 和 ID 对应相同

查看IPC对象:ipcs
删除IPC对象: ipcrm

ipcs:
在这里插入图片描述

(2)特点

在这里插入图片描述

生成key值 ftok函数

I 节点的编号和 proj_id 低 8位组合 为 ftok 生成的 key值

key_t key;
key_t ftok(const char *pathname, int proj_id);
  • pathname : 为共享内存设置的路径

(3)共享内存使用步奏

  1. 创建 / 打开共享内存
  2. 映射共享内存 (把指定的共享内存映射到进程的地址空间中,用于访问)
  3. 读写共享内存
  4. 撤销共享内存映射
  5. 删除共享内存的对象

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 	如果设置为 0NULL)将会由内核自动分配地址(推荐使用)
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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!