内存共享是进程间常用的通信方式,可以实现两个完全独立的进程通信。

在访问共享内存时,同时需要信号量进行访问控制。

使用ipcs -m命令可以查看系统共享内存,ipce -m + key 可以删除指定的共享内存。

对共享内存操作时,使用信号量对共享内存进行保护,类似与线程中的互斥锁。都可以看做是通过PV操作实现临界资源保护。

P:对信号量标记位-1,获取信号量,如果标记位为0,表示有其他进程占用资源,无法获取。

V:对信号量标记位+1,释放信号量,将资源释放,给其他进程使用。

信号量和内存共享需要使用到的函数类似,下面是具体代码实现,函数参数不具体介绍。

 //shmwrite.cpp
#include <sys/types.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <string.h>
#include <iostream> using namespace std; const int SEMTAG = 0x2456;
const int SHMTAG = 0x3443;
const int MAXBUFFLEN = ; class SemOp
{
public:
SemOp():m_iSemID(){};
void InitSem();
void GetSem();
void ReleaseSem();
void DelSem();
private:
int m_iSemID;
}; class ShmOp
{
public:
ShmOp():m_iShmID(){};
void InitShm();
void WriteShm();
void ReadShm();
void DelShm();
private:
int m_iShmID;
void *m_memAddr;
}; void SemOp::InitSem()
{
if ((m_iSemID = semget(SEMTAG, , |IPC_CREAT)) <= )
cout<<"get semID failure!"<<endl;
semctl(m_iSemID, , SETVAL, );
}
void SemOp::GetSem()
{
struct sembuf sem_get;
sem_get.sem_num = ;
sem_get.sem_op = -;
sem_get.sem_flg = SEM_UNDO;
semop(m_iSemID,&sem_get,);
}
void SemOp::ReleaseSem()
{
struct sembuf sem_release;
sem_release.sem_num = ;
sem_release.sem_op = ;
sem_release.sem_flg = SEM_UNDO;
semop(m_iSemID,&sem_release,);
}
void SemOp::DelSem()
{
semctl(m_iSemID, , IPC_RMID);
} void ShmOp::InitShm()
{
if ((m_iShmID = shmget(SHMTAG, MAXBUFFLEN, |IPC_CREAT)) <= )
cout<<"get m_iShmID failure!"<<m_iShmID<<endl;
}
void ShmOp::WriteShm()
{
char buff[MAXBUFFLEN];
cin>>buff;
m_memAddr = reinterpret_cast<void *>(shmat( m_iShmID, NULL, ));
memcpy(m_memAddr,buff,sizeof(buff)); }
void ShmOp::ReadShm()
{
char buff[MAXBUFFLEN];
m_memAddr = reinterpret_cast<void *>(shmat( m_iShmID, NULL, ));
memcpy(buff,m_memAddr,sizeof(buff));
cout<<buff;
}
void ShmOp::DelShm()
{
shmdt(m_memAddr);
} int main()
{
SemOp sem;
ShmOp shm; sem.InitSem();
shm.InitShm(); sem.GetSem();
shm.WriteShm();
sem.ReleaseSem(); shm.DelShm();
sem.DelSem();
return ;
}

读共享内存代码类似,只需要修改main函数,对共享内存执行读操作。

 int main()
{
SemOp sem;
ShmOp shm; sem.InitSem();
shm.InitShm(); sem.GetSem();
shm.ReadShm();
sem.ReleaseSem(); shm.DelShm();
sem.DelSem();
return ;
}

执行写操作后,可以使用ipcs命令查看系统共享内存情况。

执行代码结果:

进程同步(二)—— 信号量&内存共享的更多相关文章

  1. 进程间通信和同步:pipe、FIFO、消息队列、信号量、共享内存、信号

    一.半双工管道(pipe) 关于管道详细介绍可参考http://www.cnblogs.com/nufangrensheng/p/3560130.html. 1.管道实现父子进程间通信实例: /* p ...

  2. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  3. 转:Linux--进程间通信(信号量,共享内存)

    源地址:http://www.cnblogs.com/forstudy/archive/2012/03/26/2413724.html Linux--进程间通信(信号量,共享内存)(转)   一. 信 ...

  4. Linux进程间通信方式--信号,管道,消息队列,信号量,共享内存

    1.概述 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在硬.软中断中无法无阻塞地接收数据. 信号量 无法介于内核态和用户态使用. 内存共享 需要 ...

  5. 进程间通信IPC:消息队列,信号量,共享内存

    2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...

  6. Linux信号量同步共享内存实验.

    Linux信号量同步共享内存实验. Linux信号量同步共享内存实验. 简述 程序流程 信号量和共享内存的系统函数 信号量系统函数及接口 共享内存系统函数及接口 写程序 读程序 简述 本文主要内容是自 ...

  7. 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等

    一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...

  8. java多线程解读二(内存篇)

    线程的内存结构图 一.主内存与工作内存 1.Java内存模型的主要目标是定义程序中各个变量的访问规则.此处的变量与Java编程时所说的变量不一样,指包括了实例字段.静态字段和构成数组对象的元素,但是不 ...

  9. [No00003C]操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore

    操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore 进程合作:多进程共同完成一个任务 从纸上到实际:生产者− − ...

随机推荐

  1. web基础之Structs(一篇)

           为什么有 struts 框架             Struct 的优点之处: 1.       struct的好处 2.       程序更加规范化 3.       程序的可读性提 ...

  2. JAVA 正则 Pattern 和 Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...

  3. 【北京站】详解Visual Studio 2013:开发iOS及android应用!现场图集

    现场图集: 活动介绍地址:http://huiyi.csdn.net/module/meeting/meeting/info/660/biz

  4. Skrollr.js -- 使用Skrollr创建视差滚动效果页面

    使用方法:  http://www.helloweba.com/view-blog-262.html http://www.uedsc.com/skrollr.htmlhttp://www.hello ...

  5. 3大主流NoSQL数据库性能对比测试报告

    近日,知名独立基准测评机构Bankmark,针对目前市面上主流的NoSQL数据库SequoiaDB.MongoDB以及Cassandra三款NoSQL数据库产品做了性能对比测试并发布测试报告.在所有的 ...

  6. Future 模式介绍

    假设一个任务执行需要花费一些时间,为了省去不必要的等待时间,可以先获取一个提货单,即future,然后继续处理别的任务,知道货物到达,即任务完成得到结果,此时可以使用提货单提货,即通过future得到 ...

  7. 一个简单的excel文件上传到数据库方法

    因为以前项目中有用到过Excel导入,所以整理了一下,这是一个导入Excel数据到数据库的方法 注意:需要导入poi jar包 代码清单 /** * Excel 导入 * @param mapping ...

  8. Spring对事务的处理

    1.加入spring-jdbc.jar包 2.配置数据源 3.配置spring事务管理器,spring的事务出现在业务层. <bean id="dataSource" cla ...

  9. Js笔试题之parseInt()和.map()

    parseInt()的几个例子 var b = parseInt("01"); alert("b="+b); var c = parseInt("09 ...

  10. js基础之动画(三)

    一.链式运动 首先,要改进运动框架 function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; ...