Share_memory
共享内存是允许多个进程共享一块内存,由此来达到交换信息的进程通信机制;它很快没有中间介质,唯一的不足就是需要一定的同步机制控制多个进程对同一块内存的读/写,,它的原理如下:
每个共享内存段都有一个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的更多相关文章
- IPC---共享内存
共享内存就是允许两个或多个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据时,不需要在客户进程和服务器进程之间幅值,因此是最快的一种IPC.不同进程之间共享的内存通常安 ...
- linux C学习笔记05--信号量与共享内存(进程同步)
花了半天时间把信号量与共享内存整合到了一起,先来看信号量代码,semaphore.c 当中sem_P()和sem_V()函数分别为信号量等待和信号量释放. 两个进程同时访问共享内存,为了避免发生同时读 ...
- linux C学习笔记02--共享内存(进程同步)
system V下3中进程同步:共享内存(shared memory),信号量(semaphore)和消息队列(message queue) 调试了下午,终于调通啦! 运行./c.out 输出共享内存 ...
- linux C学习笔记01--makefile
不知不觉毕业五年了,以前学的linux基本都忘了,重新温习起来吧! 下面是自己写的makefile文件,供新手和自己回头时查阅 CC=gcc EXE=c.out CCC=g++ EEE=cc.out ...
- nginx学习12 ngx_cycle_t 和 ngx_init_cycle
在nginx在启动过程,ngx_init_cycle这个函数最初始工作.变量的初始化存储在ngx_cycle_t这个结构体中,为了深入了解这个函数都做了那些初始化工作,就化时间研究了一下.并写下来以便 ...
- Pytorch多进程最佳实践
预备知识 模型并行( model parallelism ):即把模型拆分放到不同的设备进行训练,分布式系统中的不同机器(GPU/CPU等)负责网络模型的不同部分 —— 例如,神经网络模型的不同网络层 ...
- 【Linux】Linux下进程间的通信方式
本文内容: 1.进程通信的目的 2.介绍Linux下进程间的4种通信方式:管道,消息队列,共享内存,信号量 ps:套接字也可以用于进程间的通信,不过是不同物理机器上的进程通信,本章讨论是是同一台物理机 ...
- Python-进程-进程池-原理
进程 资源集合,调度和分配资源,说到进程就不得不提到线程,线程和进程是密不可分,进程申请了资源,但真正使用资源的是线程,其实本质上类似面向对象的思想,面向对象把数据和数据的操作封装在一个类中,进程把资 ...
- 儿童节,和 AI 一起通关 “超级马里奥兄弟”
摘要:六一儿童节,快来训练一款自己的游戏 AI,用代码让马里奥从大反派酷霸王的魔掌里救回桃花公主. 本文分享自华为云社区<儿童节,和 AI 一起通关 "超级马里奥兄弟"> ...
随机推荐
- Java设计模式系列之单例模式
单例模式的定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供.比如,多程序读取一个配置文件时,建议配置文件时,建议配置文件封装成对象.会方便操作其中的数据,又要保证多个程序读到的是同一个配置文 ...
- DB2 VALUES用法详解
都知道Oracle有一个虚表(dual),我们可以用select sysdate from dual获取寄存器中的值.在DB2中,可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄 ...
- HDU 5752 Sqrt Bo (数论)
Sqrt Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5752 Description Let's define the function f ...
- UVA10361 - Automatic Poetry
“Oh God”, Lara Croft exclaims, “it’s one of these dumb riddles again!” In Tomb Raider XIV, Lara is, ...
- jQuery弹性滑动导航菜单实现思路及代码
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <meta na ...
- 框架学习笔记:Unity3D的MVC框架——StrangeIoC
作为从AS3页游走过来的人,看见StrangeIoC会额外亲切,因为StrangeIoC的设计和RobotLegs几乎一致,作为一款依赖注入/控制反转(IoC)的MVC框架,StrangeIoC除了使 ...
- Nginx NLB 及Redis学习
负载均衡: ARR: 微软的应用级别的负载均衡方案 NLB:服务器级别的负载均衡方案 Nginx:反向代理 达到负载均衡. Redis:用作缓存(Redis 主从配置和参数详解 http://www. ...
- VMWare里安装64位Linux 的方法
1.CPU AMD系列的CPU略过 Intel系列的CPU芯片需要支持EM64T和VT技术才行,并且BIOS也要支持才可以. 为了确定你的Intel CPU是否支持VT,请查看: http://com ...
- 让WPS支持VHDL的关键词加粗
WPS的VBA在这里下载:http://bbs.wps.cn/forum.php?mod=viewthread&tid=22347925 语法高亮是参考Word的,这篇文章:http://bl ...
- slf4j-api-1.7.5日志打印实验
下面一段话来自:百度百科 假设你开发的是类库或者嵌入式组件,那么就应该考虑採用SLF4J,由于不可能影响终于用户选择哪种日志系统.在还有一方面,假设是一个简单或者独立的应用,确定仅仅有一种日志系统,那 ...