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

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

使用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. 【待整理】PS切图基础教程

    http://www.w3cfuns.com/article-442-1-1.html http://www.w3cfuns.com/article-443-1-1.html 其他专题研究: floa ...

  2. 自动发牌(C#版)

    利用数组实现发牌过程 一副牌去掉大小王,还剩52张.一共东.南.西.北四家,每家随机发13张牌. 提示: 东.南.西.北四家用一维数组表示 每家的牌采用一维数组表示(13张)  花色:enum Sui ...

  3. SQL SERVER类型与C#类型对照

      SQL SERVER类型   C#类型 精确数字 bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数 ...

  4. sap快捷搜索菜单栏

    对于像我这样的初学者来说,用好SAP菜单栏是非常重要的.正好,偶然发现了标准的菜单搜索程序,就分享下. REPORT:SSM_SEME T-CODE:SEARCH_SAP_MENU 菜单节点表:sme ...

  5. C++的vector学习abc

    开始学习和使用vector了,用到之后再去学似乎神迹的感觉啊,就像跑一下就能给个糖吃哈哈 百度上的六种初始化的方法就不再说了,那些方法都很对. 如果没有值初始化,系统会自行初始化,目前我遇到的是用脚标 ...

  6. PHP中MySql函数收集

    1.array mysql_fetch_assoc ( resource $result ) 从结果集中取得一行作为关联数组 说明:  返回对应结果集的关联数组,并且继续移动内部数据指针. 参数:re ...

  7. java网络编程socket解析

    转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...

  8. outlook 用宏发邮件

    经常发面试邮件,通常只是修改一下收件人邮箱地址,和收件人姓名,其他全部一致,有木有发现每次都用用outlook写邮件很麻烦? 使用宏发邮件,就会不麻烦了,直接修改下称呼,修改下收件人地址,按下F5,就 ...

  9. useradd/du/df/passwd/usermod命令

    一.useradd命令 useradd命令-M -u -s -g 常用 -c:加上备注文字,备注文字保存在passwd的备注栏中.  -d:指定用户登入时的启始目录. -D:变更预设值.(修改默认配置 ...

  10. 利用电话管理器TelephonyManager获取网络和SIM卡信息

    import java.util.ArrayList;import java.util.HashMap;import java.util.Map; import android.os.Bundle;i ...