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

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

使用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. hdu 4009 Transfer water(最小型树图)

    Transfer water Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)To ...

  2. lock关键字理解

    >可以把lock关键字可以看成 try{ Monitor.Enter(x); //.. } finally{ Monitor.Exit(x); } 这样子的结构,当然使用lock关键字更方便 & ...

  3. 使用了Windows Live Writer 写的博客

    <为什么标签不能正确的显示> 重新设置了之后再看看 停用了一些插件! ​ 偶然看到很多Blog都在说:“尝试连接到您的日志时出错:服务器响应无效 – 从日志服务器接收的对 blogger. ...

  4. treap codevs 4543普通平衡树

    #include<cstdio>#include<ctime>#include<cstdlib>struct shu{ int l,r,sum1,zhi,dui,s ...

  5. ZOJ 3647 Gao the Grid dp,思路,格中取同一行的三点,经典 难度:3

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4837 三角形的总数=格子中任取3个点的组合数-同一横行任取3个点数目-同一纵行 ...

  6. HDU 1166 单点更新,区间求和

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. C++-new操作符

    1,new操作符实际上包含三部分:operator new分配内存和调用构造函数初始化刚刚分配的内存,类型转换刚刚的指针. string* ps = new string("lalalala ...

  8. java.lang.ExceptionInInitializerError

    java.lang.ExceptionInInitializerError at com.csdhsm.compiler.test.DevTest.testReadInput(DevTest.java ...

  9. JNI与NDK简介

    最近稍微了解一下JNI和NDK. 网上各种教程给人一种二者不分的感觉, 经过自己运行代码, 将两者的关系理了一下. 就目前了解,JNI应该是java自带的一种调用c和c++等语言(native cod ...

  10. iis7.5 设置伪静态

    1)首先新建一个应用程序池,名称任意,比如:nettest,托管管道模式先暂时设置为集成模式,等下面的一系列设置完成之后再设置成经典模式: 2)部署好站点,并将此站点的应用程序池设置为nettest; ...