共享内存是允许多个进程共享一块内存,由此来达到交换信息的进程通信机制;它很快没有中间介质,唯一的不足就是需要一定的同步机制控制多个进程对同一块内存的读/写,,它的原理如下:

每个共享内存段都有一个shmind_ds结构,定义如下:

struct shmid_ds
{
struct ipc_perm shm_perm;
int shm_segsz;
ushort shm_lkcnt ;
pid_t shm_cpid;
pid_t shm_lpid;
ulong shm_nattach;
time_t shm_atime;
time_t shm_dtime;
time_t shm_ctime;
};

上面的这个结构不是很懂,而shmid_ds结构每个域的含义也很复杂,这里不多介绍,下面来介绍一下有关共享内存的函数调用.

一,共享内存的创建与打开

要使用共享内存,首先要创建一个共享内存区域,创建共享内存的函数如下:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include (key_t key,int size,int flag);//参数key表示所创建或打开的共享内存的关键字;
//参数size表示共享内存区域的大小只在创建一个新的共享内存时生效;
//参数flag表示调用函数的操作类型.

函数shmget除了可以创建一个新的共享内存外,也可用于打开一个已存在的共享内存;

下面举个例子说明:

用shmget函数编制一个创建或打开一块新的共享内存的函数,代码如下:

 #include <sys/type.h>
#include <sys/ipc.h>
#include <sys/shm.h> int openshm(int size)
{
int shmid;
if(shmid=shmget(IPC_PRIVATE,size,)==-)
{
printf("'Get shared memory failed!\n);
return -;
}
return shmid;
}

shmget

二,共享内存的操作

当一个共享内存创建或打开后,某个进程如果想使用该共享内存则必须将此内存区域附加到它的地址空间,附加操作的相关调用如下:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
void *shmat(int shmid,void *addr,int flag);//参数shmid表示要附加的共享内存段的引用标识符;
//参数flag用于表示shmat函数的操作方式。

当一个进程对共享区域的访问完成以后,可以调用shmat函数使共享内存区域与该进程的地址空间分离,shmdt函数的说明如下:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmdt(void *addr);

  次函数仅用于将共享内存区域与进程的地址空间分离,不会删除共享内存本身,参数addr为要分离的共享内存区域的指针,是调用函数shmat的返回值,成功则返回值为0,否则为-1.

3,共享内存的控制

对共享内存区域的具体控制操作是通过函数shmctl来实现的,shmctl函数的说明如下:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
void shmctl(int shmid,int cmd,shmid_ds *buf);//参数shmid为共享内存段的引用标识符;
//参数cmd用于表示调用该函数希望执行的操作;
//参数buf是指向shmid_ds结构的指针。

下面来举个例子说明共享内存的实现,

共享内存实现分为两个步骤:

一、创建共享内存,使用shmget函数。

二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。

代码如下:

 #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h> #define BUFSZ 2048
int main()
{
int shmid;
char *shmadd; if((shmid=shmget(IPC_PRIVATE,BUFSZ,))<)
{
perror("shmget");
exit();
}
else
printf("created shared-memory: %d\n",shmid);
system("ipcs -m"); if((shmadd=shmat(shmid,,))<(char *)){
perror("shmat");
exit();
}
else
printf("attached shared-memory\n");
system("ipcs -m"); if((shmdt(shmadd))<){
perror("shmdt");
exit();
}
else
printf("deleted shared-memory\n");
system("ipcs -m"); exit();
}

share_memory

Share_memory的更多相关文章

  1. IPC---共享内存

    共享内存就是允许两个或多个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据时,不需要在客户进程和服务器进程之间幅值,因此是最快的一种IPC.不同进程之间共享的内存通常安 ...

  2. linux C学习笔记05--信号量与共享内存(进程同步)

    花了半天时间把信号量与共享内存整合到了一起,先来看信号量代码,semaphore.c 当中sem_P()和sem_V()函数分别为信号量等待和信号量释放. 两个进程同时访问共享内存,为了避免发生同时读 ...

  3. linux C学习笔记02--共享内存(进程同步)

    system V下3中进程同步:共享内存(shared memory),信号量(semaphore)和消息队列(message queue) 调试了下午,终于调通啦! 运行./c.out 输出共享内存 ...

  4. linux C学习笔记01--makefile

    不知不觉毕业五年了,以前学的linux基本都忘了,重新温习起来吧! 下面是自己写的makefile文件,供新手和自己回头时查阅 CC=gcc EXE=c.out CCC=g++ EEE=cc.out ...

  5. nginx学习12 ngx_cycle_t 和 ngx_init_cycle

    在nginx在启动过程,ngx_init_cycle这个函数最初始工作.变量的初始化存储在ngx_cycle_t这个结构体中,为了深入了解这个函数都做了那些初始化工作,就化时间研究了一下.并写下来以便 ...

  6. Pytorch多进程最佳实践

    预备知识 模型并行( model parallelism ):即把模型拆分放到不同的设备进行训练,分布式系统中的不同机器(GPU/CPU等)负责网络模型的不同部分 —— 例如,神经网络模型的不同网络层 ...

  7. 【Linux】Linux下进程间的通信方式

    本文内容: 1.进程通信的目的 2.介绍Linux下进程间的4种通信方式:管道,消息队列,共享内存,信号量 ps:套接字也可以用于进程间的通信,不过是不同物理机器上的进程通信,本章讨论是是同一台物理机 ...

  8. Python-进程-进程池-原理

    进程 资源集合,调度和分配资源,说到进程就不得不提到线程,线程和进程是密不可分,进程申请了资源,但真正使用资源的是线程,其实本质上类似面向对象的思想,面向对象把数据和数据的操作封装在一个类中,进程把资 ...

  9. 儿童节,和 AI 一起通关 “超级马里奥兄弟”

    摘要:六一儿童节,快来训练一款自己的游戏 AI,用代码让马里奥从大反派酷霸王的魔掌里救回桃花公主. 本文分享自华为云社区<儿童节,和 AI 一起通关 "超级马里奥兄弟"> ...

随机推荐

  1. UVALive 7276 Wooden Signs (DP)

    Wooden Signs 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/E Description http://7xjob4. ...

  2. UIButton上使用UIEdgeInsetsMake让title跟图片对齐

    UIButton上使用UIEdgeInsetsMake让title跟图片对齐 默认情况下,不设置的效果,都使居中现实,button为150*150 使用以下设置后:   [self setTitleE ...

  3. Windows Server2008 R2 MVC 环境配置

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  4. C++成员变量、构造函数的初始化顺序

    一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): st ...

  5. iOS UIWebView加载时添加进度条

    标注:此框架仅适合UIWebView  对iOS8后新出的WKWebView不适用,当然,你可以尝试修改框架里的几个代理方法. 框架是:NJKWebViewProgress 导入头文件 #import ...

  6. Smarty模板中调用PHP函数

    因为应用需要,要在Smarty中调用PHP函数,实现办法如下:模板 数据条数:{$data|count} 活动页面文件后缀:{$page|substr:'-3'} 特殊情况:{$page|str_re ...

  7. VB连接Mysql数据库

    当然机器装有mysql数据库 然后下载安装Mysql,odbc驱动 须要加入ado'菜单"project"->"引用" 找 Microsoft Activ ...

  8. Chrome Apps将可以打包成iOS或Android应用

    Chrome Apps 将可以在 iOS 和 Android 设备上独立运行了.开发者只要使用 Google今天 提供的工具集(toolchain)将自己的 Web App 打包,并将生成的应用上传到 ...

  9. Codeforces Round #313 (Div. 2) B. Gerald is into Art 水题

    B. Gerald is into Art Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560 ...

  10. string和stringbuilder的解剖

    String和StringBuilder的深入解析   前言:本文出发点是我们开发的过程中是否真正的理解stringbuilder的使用,string字符串操作的是如何实现(哈希表),stringbu ...