当前位置:首页 > 芯闻号 > 充电吧
[导读]一. 简介刚刚我们了解了我们的IPC对象,我们知道我们的System V进程间的通信,在系统建立IPC通信的时候,必须指定一个ID值。而该ID的值,我们就可以通过ftok()函数来间接的得到。共享内存


一. 简介

刚刚我们了解了我们的IPC对象,我们知道我们的System V进程间的通信,在系统建立IPC通信的时候,必须指定一个ID值。而该ID的值,我们就可以通过ftok()函数来间接的得到。共享内存就是我们的进程间的一种通信方式。

顾名思义,共享内存就是就是允许两个不相关的进程访问同一个物理内存。可以理解为多个进程共享同一块物理内存。共享内存是进程间共享数据的一种最快的方法,进程可以将相同的物理内存,映射到不同的虚拟地址空间中。所有的进程都可以访问共享内存中的数据。可以理解为C语言的malloc分配了一个空间,定义两个指针变量保存了堆区的空间一样。如果一个进行向共享内存中写入了数据,那么它的举动会影响到可以访问同一段内存的其他进程。如下图所示。



二. 共享内存的实现步骤

我们的共享内存的操作步骤分为以下四步:

1)创建共享内存 ,既然叫做共享内存,顾名思义,肯定是share memory 的缩写。函数如下。

#include

#include

int shmget(key_t key, size_t size, int shmflg);

功能:申请一块指定大小共享内存

参数:

@ key IPC_PRIVATE : 用于亲缘间进程的通信

ftok()函数获得: 用于非亲缘关系的进程

@size 申请共享内存的大小

(注:所有的内存分配时以也4K的倍数为大小进行分配的。即如果一个进程申 请了1块只有1byte的内存,操作系统也会给该内存分配4096bytes。但是真正能够使用的只有1byte。 )

@shmflg 权限标志 (常用如下)。

IPC_CREAT | 0666 如果共享内存不存在,则创建一个共享内存,否则直接打开已存在的,返回其ID。

IPC_CREAT | IPC_EXCL |0666 只有在共享内存不存在的时候,新的共享内存才建立,否则若是存在,shmges调用失败,并设置EEXITST错误码。

返回值:

成功返回共享内存的id号,失败返回-1

查看IPC对象

ipcs –m 显示共享内存段的信息

ipcs -q 显示消息队列段的信息

ipcs -s 显示信号灯集段的信息。

删除IPC对象

ipcrm -m/-q/-s ID

理解方法:可以想象成我们使用open函数打开一个文件的时候,若是使用O_CREAT | O_EXECL,0666,若是文件存在,则显示打开失败。

练习:

自己利用ftok()函数创建一个key值,然后利用shmget()创建共享内存。

如果共享内存存在则报错,不存在则创建。自己利用ipcs命令查看共享内存信息。

2)映射共享内存,把共享内存和进程的地址空间联系起来。(share memeor attach)

手册阅读:

翻译:

shmat() 函数映射一个共享内存段,把它和由当前进程调用的由shmid参数指定的地址空间联系起来。

这个指定的地址空间,由shmaddr下列选择指定:

如果 shmaddr 是NULL,操作系统选择一个合适的(未使用的)共享内存段。

如果SHM_RDONLY 被shmflag标志指定,这个被映射的进程的地址空间必须拥有读权限。另一方面,段连接的地址空间若是想要读写的话,必须要有读和写的权限。没有一个只写概念的共享内存段。

Shamt()函数成功返回共享内存映射的地址空间,失败返回(void *)-1并设置error

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

功能:把shmid创建共享内存块附加到进程的私有地址。[进程的虚拟地址空间]

参数:

@ shmid 共享内存段的标识 [由shmget()函数得到]

@ shmaddr[将共享内存映射到指定的地址空间]

NULL 让系统自动完成映射

@ shmflg[映射的标志] 0 映射可以读写;

SHM_RDONLY 映射后只能读

返回值:成功返回映射后的进程的地址空间

失败返回(void *)-1,并且置errno

注意:进程结束之后,共享内存的映射自动撤销。

3)撤销共享内存。

int shmdt (const void * shmaddr);

功能:撤销共享内存到进程地址空间的映射

参数:

@smaddr 共享内存映射到进程指定的地址空间

返回值:

成功返回 0

失败返回 -1, 并且置errno

注:给shmdt传递的地址必须是shmat()函数获得的。

4)删除共享内存。[shmat control]

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

功能:对共享内存进行控制

参数:

@shmid 共享内存段的标识 [由shmget()函数得到]

@cmd 共享内存的控制命令

IPC_RMID 删除共享内存。

@buf shmid 的一些信息。

NULL 表示不需要使用它。

返回值:

成功返回0,失败返回-1

//结构体简介 [了解即可]

struct shmid_ds

{

struct ipc_perm shm_perm;/* 操作权限*/

int shm_segsz; /*段的大小(以字节为单位)*/

time_t shm_atime; /*最后一个进程附加到该段的时间*/

time_t shm_dtime; /*最后一个进程离开该段的时间*/

time_t shm_ctime; /*最后一个进程修改该段的时间*/

unsigned short shm_cpid; /*创建该段进程的pid*/

unsigned short shm_lpid; /*在该段上操作的最后1个进程的pid*/

short shm_nattch; /*当前附加到该段的进程的个数*/

/*下面是私有的*/

unsigned short shm_npages; /*段的大小(以页为单位)*/

unsigned long *shm_pages; /*指向frames->SHMMAX的指针数组*/

struct vm_area_struct *attaches; /*对共享段的描述*/

};

IPC_RMID 破化共享内存段。

代码演示:





运行结果:

练习:利用共享内存实现两个进程间的shm_read.C和shm_write.C之间的通信。

[注意:两个进程只要打开的是同一个文件路径,则获得相同的共享内存。]

思路:

shm_read.c

//接收写进程的信号

Signal(SIGUSR1,signal_handler)

{

}

//创建共享内存

Shget

//内存映射

Shmat

通过getpid()得到自己的pid号写到共享内存中,让write进程获取。

*(int *)paddr = getpid();

//循环把数据写到共享内存中去

While(1)

{

Pause();//修改等待写进程书写完毕,接收信号。

Read();

}

//撤销进程

//删除共享内存

shm_write.c

//创建共享内存

Shget

//内存映射

Shmat

//获得read进程的pid号,以便于向read进程发送信号

Pid = *(int *)paddr;

While(1)

{

putchar(‘>’);

fgets();

//书写完毕发送信号。

kill(pid,SIGUSR1);

}

//解除映射

//删除共享内存

注意:由于write进程要获得read进程的pid号,故要求read进程先运行,write进程后运行。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭