共享内存---shmget shmat shmdt

From: http://fengxue103.blog.hexun.com/32303320_d.html

 

要使用共享内存,应该有如下步骤:
1.开辟一块共享内存 shmget()
2.允许本进程使用共某块共享内存 shmat()
3.写入/读出
4.禁止本进程使用这块共享内存 shmdt()
5.删除这块共享内存 shmctl()或者命令行下ipcrm


ftok()。它有两个参数,一个是字符串,一个是字符。字符串一般用当前进程的程序名,字符一般用来标记这个标识符所标识的共享内存是这个进程所开辟的第几个共享内存。ftok()会返回一个key_t型的值,也就是计算出来的标识符的值。

shmkey = ftok( "mcut" , 'a' ); // 计算标识符

操作共享内存,我们用到了下面的函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmget( key_t shmkey , int shmsiz , int flag );
void *shmat( int shmid , char *shmaddr , int shmflag );
int shmdt( char *shmaddr );

shmget()是用来开辟/指向一块共享内存的函数。参数定义如下:
key_t shmkey 是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替。但是刚才我们的两个进程没有任何关系,所以就用ftok()算出来一个标识符使用了。
int shmsiz 是这块内存的大小.
int flag 是这块内存的模式(mode)以及权限标识。
模式可取如下值: 新建:IPC_CREAT
使用已开辟的内存:IPC_ALLOC
如果标识符以存在,则返回错误值:IPC_EXCL
然后将“模式” 和“权限标识”进行“或”运算,做为第三个参数。
如: IPC_CREAT | IPC_EXCL | 0666
这个函数成功时返回共享内存的ID,失败时返回-1。

// shmid开辟共享内存

shmid = shmget( shmkey , sizeof(in_data) , IPC_CREAT | 0666 ) ;


shmat()是用来允许本进程访问一块共享内存的函数。
int shmid是那块共享内存的ID。
char *shmaddr是共享内存的起始地址
int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
成功时,这个函数返回共享内存的起始地址。失败时返回-1。

char *head , *pos ,

head = pos = shmat( shmid , 0 , 0 );

// 允许本进程使用这块共享内存

shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数。
参数char *shmaddr是那块共享内存的起始地址。
成功时返回0。失败时返回-1。

shmdt( head ); // 禁止本进程使用这块内存

此外,还有一个用来控制共享内存的shmctl()函数如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl( int shmid , int cmd , struct shmid_ds *buf );
int shmid是共享内存的ID。
int cmd是控制命令,可取值如下:
IPC_STAT 得到共享内存的状态
IPC_SET 改变共享内存的状态
IPC_RMID 删除共享内存
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。
返回值: 成功:0
失败:-1

shmctl(shmid,IPC_RMID,NULL);

刚才我们的mpaste.c程序中还可以加入这样几句。

struct shmid_ds buf;
... ...
shmctl( shmid , IPC_STAT , &buf ); // 取得共享内存的状态
... ...
shmctl( shmid , IPC_RMID , &buf ); // 删除共享内存

注意!!!!!!!!!:在使用共享内存,结束程序退出后。如果你没在程序中用shmctl()删除共享内存的话,一定要在命令行下用ipcrm命令删除这块共享内存。你要是不管的话,它就一直在那儿放着了。
简单解释一下ipcs命令和ipcrm命令。

 

取得ipc信息:
ipcs [-m|-q|-s]
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出有关“遮断器”(semaphore)的信息
%ipcs -m

删除ipc
ipcrm -m|-q|-s shm_id
%ipcrm -m 105

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React开发(127):引入icon的方式

新增 icon 步骤&#xff1a;1&#xff0c;找到对应icon库&#xff0c;然后点击下载至本地按钮。2&#xff0c;解压下载的文件&#xff0c;找到 iconfont.css 3&#xff0c;打开该文件&#xff0c;从第三个类开始复制&#xff0c;然后集体替换这个文件的第三个类

“入洞房与度蜜月”的来历

中华民族文明史距今已有五千多年了&#xff0c;人们把结婚仍然称为“入洞房”&#xff0c;尽管人类从洞穴式居住过渡到今天的高楼大厦&#xff0c;但入洞房这一名词至今仍未改变。从来没见过谁把“入洞房”改为“入楼房”。 传说&#xff0c;这是我们祖先轩辕黄帝规定下来的…

STL容器的capacity()和reserve()演示-----vector

#include <iostream>#include <vector>using namespace std;int main(){vector<int> v;cout<<v.size()<<", "<< v.capacity()<<endl;v.reserve(12);for(int i 0; i < 13; i) // 超出vector本身容量后&#xff0c;会导…

lua 的语法糖

tb {} function tb:fun1()self ---tb endfunction tb.fun2()self ---->无 endtb:fun1()tb.fun2()------self 相当于 this lua函有 tb.fun2() 这样的定义 没有this(self) tolua 加了对象定义 转载于:https://www.cnblogs.com/mattins/p/3967018.html

vue设置页面标题title

每个页面设置相同标题 index.html 直接修改title标签里面的标题 (ps: 这个html文件中也可以引入一些js文件) 每个页面设置不同标题 router - index.js const router new Router({mode: history,routes: [{path: /index,name: index,component: Index,meta:{// 页面标题ti…

CSS之background-size属性

语法&#xff1a;background-size: auto || <length> || <percentage> || cover || contain 取值说明&#xff1a; 1.auto:此值为默认值&#xff0c;保持背景图片的原始高度和宽度 2.<length>此值设置具体的值&#xff0c;可以改变背景图片的大小 3.<…

魔界的青蔷薇也能在人间开放了

under the moon和いじわる my master里面提到过&#xff0c;青蔷薇是一种只能在魔界盛开的花&#xff0c;花语是&#xff1a;不可能。青蔷薇姬的故事是&#xff1a;我不要你的珠宝&#xff0c;只要你的真心。[separator][quote]11月1日闭幕的东京国际花卉博览会上&#xff0c;全…

javascript学习系列(19):数组中的Array.from方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

本地套接字示例[来源:Advanced Linux Programming]

本地套接字示例[来源:Advanced Linux Programming] 要通过套接字连接同一台主机上的进程&#xff0c;可以使用符号常量 PF_LOCAL 和 PF_UNIX所代表的本地命名空间。它们被称为本地套接字&#xff08;local sockets&#xff09;或者 UNIX 域套接字&#xff08;UNIX-domain socke…

在JAVA中如何跳出当前的多重嵌套循环

在Java中&#xff0c;要想跳出多重循环&#xff0c;可以在外面的循环语句前定义一个标号&#xff0c;然后在里层循环体的代码中使用带有标号的break 语句&#xff0c;即可跳出外层循环。例如&#xff0c; ok: for(int i0;i<10;i) { for(int j0;j<10;j) { System.out.prin…

CSS之background-position属性

1.作用&#xff1a;background-position是用来控制元素背景图片的位置。以图片的左上角顶点为原点&#xff0c;属性值为正就代表图片下移或右移&#xff0c;属性值为负就代表图片上移或左移。它接受三种值 - 关键词&#xff0c;比如top、right、bottom、left和center - 长度值…

vue-cli3.0之vue.config.js的配置项(注解)

module.exports {// 部署应用时的基本 URL(从 Vue CLI 3.3 起已弃用&#xff0c;请使用publicPath。)baseUrl: process.env.NODE_ENV production ? 192.168.60.110:8080 : 192.168.60.110:8080,// 部署应用包时的基本 URL。用法和 webpack 本身的 output.publicPath 一致pub…

用户登录成功后才进入主窗口进行其他操作

应用前景&#xff1a;面对一个应用程序&#xff0c;用户只有输入正确的用户名和密码后&#xff0c;才能进入主窗口进行其他的操作&#xff1b;否则&#xff0c;提示登录失败&#xff0c;重新输入。 开发环境&#xff1a;Windows XP VC6.0 新建一个基于MFC的单文档应用程序(项…

javascript学习系列(20):数组中的bind,apply,call

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

DSOfile,修改windows系统文件摘要

今天要做一个功能&#xff0c;就是修改图片的摘要信息&#xff0c;一开始采用的是修改exif信息的方式&#xff0c;但是很多的图片没有exif信息&#xff0c;或者没有指定的exif项&#xff0c;又找别的方法&#xff0c;来修改文件的摘要信息。 首先是采用ole32.dll,但是郁闷的是&…

CSS之background-origin属性

1.作用&#xff1a;其实background-origin主要就是用来决定背景图片的定位原点&#xff0c;换句话说就是背景图片定位的起点&#xff08;background-position的原点&#xff09; 如果你看过了《CSS3 background-clip》一文&#xff0c;你不难发现&#xff0c;元素Background中…

Vue.js CLI4 Vue.config.js标准配置 (最全注释)

前言&#xff1a; Vue.js CLI工具 不知不觉发展到了4.0时代&#xff0c;CLI给人最直白的感受是没有了build文件夹跟config文件夹&#xff0c;所有的配置都在Vue.config.js完成。那么该文件的配置至关重要。现在我们来看一下最新配置是怎么配置的。 有三种方式&#xff0c;推荐…

javascript学习系列(22):数组中的reduceRight法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…