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

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

使用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---(1280)前m大的数(计数排序)

    前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. 预处器的对比——Sass、LESS.

    发挥CSS预处器的作用是一种很有挑战性的事情.CSS预处器有不同的语言,有不同的语法和功能. 不同CSS预处器的蛮量.功能以及他们的好处——Sass.LESS 介绍 CSS预处理器是一种语言,用来编写 ...

  3. 盘点十大最流行的Linux服务器发行版

    随着Linux不断发展,Linux所支持的文件系统类型也在迅速扩充.很多的数据中心服务器上都运行着Linux,可以节省大量的许可证费用及维护费用.但伴随着Linux新版本的发行,其中每一个不同版本的L ...

  4. 源代码解读Cas实现单点登出(single sign out)功能实现原理

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  5. Apache Thrift - 可伸缩的跨语言服务开发框架

    To put it simply, Apache Thrift is a binary communication protocol 原文地址:http://www.ibm.com/developer ...

  6. 【数论+技巧】神奇的Noip模拟试题第二试 T1 素数统计

    1.      素数统计 (pcount.pas/.c/.cpp) [问题描述] 小tan的老师揣谙戈给同学们布置了一道题,要求统计给定区间内素数的个数.“这不是很简单吗?”小tan忍不住说.揣谙戈冷 ...

  7. 面试题目-c和c++的区别

    在很大程度上,标准C++是标准C的超集.实际上,所有C程序也是C++程序,然而,两者之间有少量区别.下面简要介绍一下最重要的区别.    1. 在C++中,局部变量可以在一个程序块内在任何地方声明,在 ...

  8. jsp中普通按钮如何提交表单

    jsp中普通按钮如何提交表单方法1: <form action = "提交的地址">         <input type="submit" ...

  9. Android之sdcard操作

    private static final String FILENAME = "abc.txt"; private static final String DIR = " ...

  10. Android布局— — —表格布局

    表格布局 以表格的形式来显示界面中的控件,表格的每一行为一个TableRow,每当一个控件添加到TableRow中,就生成一个单元格. 语法格式: <TableLayout xmlns:andr ...