当前位置:首页 > 嵌入式 > 嵌入式硬件

作者:曾宏安,华清远见嵌入式学院讲师。

1.共享内存概述

共享内存允许两个或更多进程共享一给定的存储区。因为数据不需要在各个进程之间复制,所以这是最快的一种进程间通信方式。使用共享内存时的关键点在于如何在多个进程之间对一给定的存储区进行同步访问。

例如若一个进程正在将数据放入共享内存区,则在它做完这一操作之前,其他进程不应该去取这些数据。通常,信号量被用来实现对共享内存访问的同步。

2.函数说明

共享内存的实现分为4个步骤。

第一步是创建共享内存,这里用到的函数是shmget,也就是从内存中获得一段共享内存区域。

第二步是映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间去。这里使用的函数是shmat。

第三步是撤销映射的操作,其函数为shmdt。

第四步是删除创建的共享内存,用到的函数是shmctl。

3.函数格式

以上函数用到的头文件如下所示。

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

shmget函数的语法

函数原型

int shmget( key_t key, /* IPC_PRIVAte */

int size, /* 共享内存区大小 */

int shm*) /* 同open函数的权限位,也可以用8进制表示法 */

函数返回值

成功:共享内存段标识符

出错:-1

shmat函数的语法

函数原型

char *shmat( int shMID, /* 要映射的共享内存区标识符 */

cONST void *shmaddr, /* 将共享内存映射到指定位置(若为0则表示把该段共享内存映射到调用进程的地址空间)*/

int shm*) /* SHM_RDONLY :共享内存只读

默认0 :共享内存可读写*/

函数返回值

成功:被映射的段地址

出错:-1

shmdt函数的语法

函数原型

int shmdt(const void *shmaddr) /* 被映射的共享内存段地址 */

函数返回值

成功:0

出错:-1

shmctl函数的语法

函数原型

int shmctl(int shmid, /* 要操作的共享内存区标识符 */

int cmd, /*IPC _RMID : 删除共享内存

IPC_STAT : 获取共享内存属性

IPC_SET : 设置共享内存属性 */

struct shmid_ds *buf) /* 指向保存共享内存属性的结构体的指针*/

函数返回值

成功:0

出错:-1

4.使用实例

首先使用shmget函数,首先创建一个共享内存区,之后将其映射到本进程中,最后再解除这种映射关系并删除创建的共享内存。

这里要介绍的一个命令是ipcs,这是用于报告进程间通信机制状态的命令,它可以查看共享内存、消息队列等各种进程间通信机制的情况,这里使用了system函数用于调用命令ipcs,参考代码如下所示:

/*创建共享内存*/

int shmid;

void *shmadd;

if ((shmid = shmget(IPC_PRIVATE,BUFSZ,0666)) < 0 )

{

perror(“fail to shmget ”);

exit(-1);

}

syetem(“ipcs –m”);

/*映射共享内存*/

if ((shmadd = shmat(shmid,0,0)) == NULL )

{

perror(“fail to shmat ”);

exit(-1);

}

syetem(“ipcs –m”);

/*删除共享内存*/

if (shmdt(shmadd) < 0 )

{

perror(“fail to shmdt ”);

exit(-1);

}

syetem(“ipcs –m”);

if (shmctl(shmid, IPC_RMID, NULL) < 0 )

{

perror(“fail to shmctl ”);

exit(-1);

}

syetem(“ipcs –m”);
“本文由华清远见http://www.embedu.org/index.htm提供”



华清远见

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

上个月,爱立信刚刚传出“对中国区业务进行战略调整,研发岗大面积裁员”的消息。这几天,就有员工确认,爱立信“核心网”成为了此次裁员的“重灾区”。

关键字: 爱立信 通信

据韩联社报道,上周三星电子发布业绩报告显示,随着芯片价格反弹,预计今年第一季度营业利润同比骤增931.25%,为6.6万亿韩元(当前约合人民币354.6亿元),已经超过了2023年全年营业利润6.57万亿韩元。

关键字: 内存 三星

设计工程师为了解决ISI问题,常常需要在链路损耗和均衡技术之间做出综合考虑。泰克的SDLA软件不仅可以模拟发送端的Tx EQ和接收端的Rx EQ,还能模拟传输链路的不同损耗。

关键字: 通信 示波器 测试测量

TDK 株式会社(TSE:6762)进一步扩充 Micronas 嵌入式电机控制器系列 HVC 5x,完全集成电机控制器与 HVC-5222D 和 HVC-5422D,以驱动小型有刷(BDC)、无刷(BLDC)或步进电机...

关键字: 嵌入式 电机控制器 内存

Apr. 04, 2024 ---- TrendForce集邦咨询针对403震后各半导体厂动态更新,由于本次地震大多晶圆代工厂都位属在震度四级的区域,加上台湾地区的半导体工厂多以高规格兴建,内部的减震措施都是世界顶尖水平...

关键字: 晶圆代工 内存

5G网络相较于4G网络,具有更高的数据传输速率,能够支持更高的峰值速率,理论上峰值传输速率可以达到10Gbit/s,这比4G网络快了大约10到100倍。

关键字: 5G 通信 4G网络

美光坚持多元、平等、包容的企业文化,携手社区推行公益

关键字: 内存 存储 美光

今天,小编将在这篇文章中为大家带来虚拟内存的有关报道,通过阅读这篇文章,大家可以对虚拟内存具备清晰的认识,主要内容如下。

关键字: 内存 虚拟内存

在这篇文章中,小编将对虚拟内存的相关内容和情况加以介绍以帮助大家增进对它的了解程度,和小编一起来阅读以下内容吧。

关键字: 内存 虚拟内存

以下内容中,小编将对物理内存的相关内容进行着重介绍和阐述,希望本文能帮您增进对物理内存的了解,和小编一起来看看吧。

关键字: 内存 物理内存
关闭
关闭