进程同步(二)—— 信号量&内存共享
内存共享是进程间常用的通信方式,可以实现两个完全独立的进程通信。
在访问共享内存时,同时需要信号量进行访问控制。
使用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命令查看系统共享内存情况。
执行代码结果:
进程同步(二)—— 信号量&内存共享的更多相关文章
- 进程间通信和同步:pipe、FIFO、消息队列、信号量、共享内存、信号
一.半双工管道(pipe) 关于管道详细介绍可参考http://www.cnblogs.com/nufangrensheng/p/3560130.html. 1.管道实现父子进程间通信实例: /* p ...
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...
- 转:Linux--进程间通信(信号量,共享内存)
源地址:http://www.cnblogs.com/forstudy/archive/2012/03/26/2413724.html Linux--进程间通信(信号量,共享内存)(转) 一. 信 ...
- Linux进程间通信方式--信号,管道,消息队列,信号量,共享内存
1.概述 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在硬.软中断中无法无阻塞地接收数据. 信号量 无法介于内核态和用户态使用. 内存共享 需要 ...
- 进程间通信IPC:消息队列,信号量,共享内存
2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...
- Linux信号量同步共享内存实验.
Linux信号量同步共享内存实验. Linux信号量同步共享内存实验. 简述 程序流程 信号量和共享内存的系统函数 信号量系统函数及接口 共享内存系统函数及接口 写程序 读程序 简述 本文主要内容是自 ...
- 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等
一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...
- java多线程解读二(内存篇)
线程的内存结构图 一.主内存与工作内存 1.Java内存模型的主要目标是定义程序中各个变量的访问规则.此处的变量与Java编程时所说的变量不一样,指包括了实例字段.静态字段和构成数组对象的元素,但是不 ...
- [No00003C]操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore
操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore 进程合作:多进程共同完成一个任务 从纸上到实际:生产者− − ...
随机推荐
- hdu------(4302)Holedox Eating(树状数组+二分)
Holedox Eating Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Java 读写方案
使用Java操作文本文件的方法详解 摘要: 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而 ...
- 使用Astah繪製UML圖形(转)
http://www.dotblogs.com.tw/clark/archive/2015/02/12/149483.aspx
- Response返回JSON数据到前台页面
转自博文:<Response JSON数据返回>http://blog.csdn.net/anialy/article/details/8665471 简述: 在servlet填充Resp ...
- Tengine vs openresty
简介 Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到 ...
- js——倒计时
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C#常用的加密算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 方法一: //须添加对System.Web的引用 ...
- [转]Web基础架构:负载均衡和LVS
以下内容转载自:http://www.importnew.com/11229.html 在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服 ...
- Thinking in java之正则表达式小例子
public static final String POEM= "Twas brilling, and the slithy toves\n" + "Did gyre ...
- S1:对象与JSON
JSON全称为JavaScript对象表示法(JavaScript Object Notation). JSON是JavaScript中对象的字面量,是对象的表示方法,通过使用JSON,可以减少中间变 ...