ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

在shmdt()之后和shmctl之前访问共享内存(shmid,ipc_RMID,0)

2019-06-23 22:39:21  阅读:708  来源: 互联网

标签:c-3 linux process shared-memory


假设我有一个指针* p到先前分配的共享内存.

如果其中一个进程调用shmdt()来分离共享内存段,然后尝试分配一个值,例如:

*p = 0;

在调用shmctl(shmid,IPC_RMID,0)进行销毁之前.

这样做会导致错误吗?我无法理解哪些以及为什么.

解决方法:

是的,这是一个错误,很可能会导致段错误.

当您调用shmget(2)来分配共享内存段时,它不会立即放在进程的虚拟地址空间中的任何位置.也就是说,没有可写入的地址可以将数据写入段中.

shmat(2)的工作是将段(映射)放入进程的地址空间. (在System V共享内存的说法中,这称为附加段,但该术语在其他地方使用不多.映射更常见.)成功调用shmat()后,段将出现在某个地址和该地址作为shmat()的结果返回.

在先前附加的段上调用shmdt(2)会使该段再次从进程的虚拟地址空间中消失.尝试写入以前属于映射的地址是一个错误,因为映射不再存在.这并不意味着写入段的数据会丢失 – 它只是没有映射到任何地方.您可以通过对shmat(2)的另一次调用重新映射(重新附加)该段以再次访问数据.

只有在使用shmctl()和IPC_RMID销毁段之后才会释放实际释放的内存(一旦段不再附加到任何位置).

为了使事情更具体,以下是共享内存的简单实现如何在高级别上工作:

> shmget()根据您请求的段分配尽可能多的物理内存.
> shmat()对MMU进行编程并在内核中进行设置,以便进程中的某些地址范围映射到段.
> shmdt()执行反向操作并删除映射.
>带有IPC_RMID的shmctl()解除分段的物理内存(将其标记为空闲).

作为旁注,可以使用shmat(2)将相同的段映射到地址空间中的多个位置.这是可能的,因为它纯粹是虚拟内存操作.

标签:c-3,linux,process,shared-memory
来源: https://codeday.me/bug/20190623/1275211.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有