Linux进程通信之共享内存
创始人
2024-03-08 19:26:08

一、共享内存之原理

1.是在物理内存中开辟了一片空间;

2.不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间之中

3.不同的进程可以通过操作自己的虚拟地址空间中的虚拟地址去操作共享内存(物理地址)

共享内存是最快的进程之间的通信方式,所以很多进程之间的通信方式都是用共享内存:eg:守护进程和被守护的进程

二、共享内存的接口

        1.创建、获取共享内存的接口

int shmget(key_t,size_t size, int shmflg)                //shm  shared memory

参数:
key:共享内存的标识符

size:共享内存的大小

shmflg:获取、创建共享内存时所传递的属性信息:

                IPC_CREAT:若获取的共享内存不存在时就创建它

                IPC_EXCL | IPC_CREAT: 若获取的共享内存存在,则函数报错;若获取的共享内存不存在则创建。

                本质上,该组合是要获取重新创建的共享内存

                 按位或上权限

返回值:

        成功:返回共享内存的操作句柄:

       操作共享内存实质就是要操作其句柄

        失败:返回-1;

        2.将共享内存附加到进程的虚拟地址空间

void *shmat(int shmid,const void *shmaddi, int shmflg);

参数:

shmid:共享内存的操作句柄

shmaddr:将共享内存附加到共享区当中的第一个地址,一般让操作系统自己分配,传递NULL

shmflag:用什么权限将共享内存附加到进程中

                SHM_RDONLY:只读

                0:可读可写

 返回值:

                成功:返回附加到的虚拟地址

                失败:-1

        3.分离

int shmdt(const void *shmaddr)

参数:

shmaddr:附加到的虚拟地址(shmat函数执行成功的返回值)

返回值:

成功:0;

失败: -1;

        4.操作共享内存的接口

int  shmctl(int shmid,int cmd,struct shmid_ds *buf)

参数:

shmid:共享内存的操作句柄;

cmd:告诉shmctl函数要完成的功能:
        IPC_SET:设置共享内存属性信息,此时,buf是输入性参数,由程序员组织,传递给shmctl参数

        IPC_STAT:获取共享内存的属性信息,此时,buf是输出型参数,由shmctl函数填充

        IPC_RMID:删除共享内存,此时buf设置为NULL

        buf:共享内存的数据结构

通过IPCS-M查看共享内存:

 利用shmctl删除共享内存:

        

三、共享内存的代码

写入共享内存:

#include
#include
#includeint main()
{int ret=shmget(0x12345678,1024,IPC_CREAT | 0664);if(ret<0){perror("shmget \n");return 0;}void *addr=shmat(ret,NULL,0); //得到附加到的虚拟地址if(addr==NULL){perror("shmat  \n");return 0;}printf("addr=%p\n",addr);strcpy((char * )addr,"Love and peace \n" );sleep(100);shmdt(addr);
return 0;
}

从共享内存中读取:

#include
#include
#includeint main()
{int shmid=shmget(0x12345678,1024,IPC_CREAT);if(shmid<0){perror("shmget \n");return 0;}void *addr=shmat(shmid,NULL,SHM_RDONLY);if(addr==NULL){perror("shmat \n");return 0;}printf("read: %s :  \n",(char *)addr );shmdt(addr);
return 0;
}

 

四、共享内存的特性

1.生命周期跟随操作系统

2.共享内存是覆盖写的方式,读取共享内存时,是访问其地址,并没有将数据读取走

3.共享内存的删除特性:
        1 ipcrm -m [shmid]:删除了共享内存

一旦共享内存被删除掉了,共享内存所在物理内存中的空间也同时被销毁了

如果删除的共享内存时,其附加的进程数量为0,则删除后,内核中描述该共享内存的结构体也被释放了。

若删除的共享内存的附加到进程数不为0,则会将该共享内存的key设置为0x00000000,表示该共享内存不可被其他的进程所附加,当附加的进程全部退出时,操作系统会将其在内核中的结构体释放。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...