共享内存shm*(生产者和消费者)
//heads.h
#ifndef HEAD_H
#define HEAD_H
#include <iostream>
#include <sys/shm.h> //share momery
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "shm_com.h"
#endif // HEAD_H
shm_com.h
#ifndef SHM_COM
#define SHM_COM #define TEXT_SZ 2048
struct shared_use_st{
int written_by_you;
char some_text[TEXT_SZ];
}; #endif // SHM_COM
consumer.cpp
#include "headers.h"
using namespace std;
//consumer
int main()
{
int running = ;
void *shared_memory = (void *);
struct shared_use_st *shared_stuff;
int shmid; srand((unsigned int)getpid()); shmid = shmget((key_t), sizeof(struct shared_use_st),|IPC_CREAT); if(shmid == -)
{
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
} //sec let sys select shm address,
//thi SHM_RND or SHM_RDONLY
shared_memory = shmat(shmid, (void *), );
if(shared_memory == (void *)-)
{
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
} printf("Memory attached at %X\n",(unsigned int)(long)shared_memory); shared_stuff = (struct shared_use_st *)shared_memory;
shared_stuff->written_by_you = ; while (running) {
if (shared_stuff->written_by_you) {
printf("You wrote: %s", shared_stuff->some_text);
sleep(rand()%);
shared_stuff->written_by_you = ;
if (strncmp(shared_stuff->some_text, "end", ) == ) {
running = ;
}
}
} //shm devide and rm
if(shmdt(shared_memory) == -){
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
} if(shmctl(shmid, IPC_RMID, ) == -){
fprintf(stderr, "shctl(IPC_RMID) failed \n");
exit(EXIT_FAILURE);
} exit(EXIT_SUCCESS);
}
producer.cpp
#include "headers.h"
using namespace std;
//producer
int main()
{
int running = ;
void *shared_memory = (void *);
struct shared_use_st *shared_stuff;
char buffer[BUFSIZ];
int shmid; shmid = shmget((key_t), sizeof(struct shared_use_st), |IPC_CREAT);
//
if (shmid == -) {
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
} shared_memory =shmat(shmid, (void *), ); if(shared_memory == (void *)-){
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
} printf("memory attached at %X\n", (unsigned int)(long)shared_memory); shared_stuff = (struct shared_use_st *)shared_memory; while (running) {
while (shared_stuff->written_by_you == ) {
sleep();
printf("waiting for client...\n");
} printf("Enter some text: ");
fgets(buffer, BUFSIZ, stdin); strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
shared_stuff->written_by_you = ; if(strncmp(buffer, "end", ) == ){
running = ;
}
} if(shmdt(shared_memory) == -){
fprintf(stderr, "shmdt failed\n");
exit(EXIT_FAILURE);
}
return ;
}
unix编程一书
共享内存shm*(生产者和消费者)的更多相关文章
- Linux进程通信之共享内存实现生产者/消费者模式
共享内存 共享内存是内核为进程创建的一个特殊内存段,它将出现在进程自己的地址空间中,其它进程可以将同一段共享内存连接(attach)到自己的地址空间.这是最快的进程间通信方式,但是不提供任何同步功能( ...
- Centos下10000次循环测试php对Redis和共享内存(shm)读写效率
redis和memcache还有共享内存都是读取内存的数据,为了测试一下到底效率谁更胜一筹,我在我的Centos虚拟机下做了一次公平的测试. 测试参数 环境:Centos (配置忽略).语言:PHP. ...
- C扩展 从共享内存shm到memcache外部内存
引言 - ipc - shm 共享内存 本文会通过案例了解ipc 的共享内存机制使用, 后面会讲解C 如何使用外部内存服务memcached. 好先开始了解 linux 共享内存机制. 推荐先参看下面 ...
- [笔记]共享内存(shm)
一.特点 共享内存允许多个不同的进程可以访问同一块内存.相较于其他IPC形式,具有速度快,效率高的特点,共享内存的存在降低了在大规模数据处理过程中内存的消耗. 二.创建共享内存 1.头文件 #incl ...
- vector存入共享内存(了解)
昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到S ...
- linux使用共享内存通信的进程同步退出问题
两个甚至多个进程使用共享内存(shm)通信,总遇到同步问题.这里的“同步问题”不是说进程读写同步问题,这个用信号量就好了.这里的同步问题说的是同步退出问题,到底谁先退出,怎么知道对方退出了.举个例子: ...
- C 共享内存封装
引言 - 背景 2016 年写过一篇关于 linux 共享内存 shm api 扫盲文. C扩展 从共享内存shm到memcache外部内存 比较简单. 没有深入分析(能力有限, 也深入分析不了). ...
- Linux下IPC之共享内存的使用方法
基本参考 <Unix环境高级编程>第14.9节共享内存来学习. 参考blog:https://blog.csdn.net/weixin_45794138/article/details/1 ...
- OS: 生产者消费者问题(二) ---- 系统V IPC通信-信号量和共享内存
在上一篇“OS: 生产者消费者问题(多进程+共享内存+信号量)”中提到的方法二: 如果进程之间并没有父子关系,但是协商好了共享存储的 KEY , 那么在每个进程中,就可以通过 KEY 以及 shmge ...
随机推荐
- 一次ajax调用,发送了两次请求(一次为请求方法为option,一次为正常请求)
在项目了开发时遇见一个奇怪的现象,就是我在js里面发送一次ajax请求,在浏览器network那边查询到的却是发送了两次请求,第一次的Request Method参数为OPTIONS,第二次的Requ ...
- 浅谈jQuery构造函数
$()函数到底做的什么 jQuery在前端领域路人皆知,对于一向喜欢玩js的博主来说,虽然能力有限,但是还是很喜欢研究他的做为.那么一个简单的美元符号$与一对常见的()括号,jQuery底层到底做了哪 ...
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-中坚阶段
2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-中坚阶段 如今的编写,进入了一段时间的中坚阶段,小伙伴的思路虽然很一致,但是总是存在着一定问题,这就造成了我们中坚阶 ...
- 《UML大战需求分析》-读后感三
用例图是用来描述什么角色通过某某系统能做什么的图,用例图关注的是系统的外在表示想爱你.系统与人的交互系统与其他系统的交互,小人执行者就是角色,角色 是对系统使用者的抽象,一个角色可以代表多个具体的人而 ...
- Java script 的dom编程
实例1: </head> <body> <div id="div1"> <p id="p1">这是一个段落< ...
- 配置docker的私有仓库
1:安装docker-registry包 yum install -y docker-distribution 2:启动docker-distribution,默认监听于TCP/5000端口 sy ...
- 用户数以及psp
小组名称:好好学习 小组成员:林莉 王东涵 胡丽娜 宫丽君 项目名称: 记账本 alpha发布48小时以后用户数如何,是否达到预期目标,为什么,是否需要改进,如何改进(或理性估算). 首先我 ...
- Openresty+Lua+Redis灰度发布
灰度发布,简单来说,就是根据各种条件,让一部分用户使用旧版本,另一部分用户使用新版本.百度百科中解释:灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式.AB test就是一种灰度发布方式,让一部分 ...
- Nfs的简单了解
近期在上传公司课件课程,上传的思路是,在45服务器上建立44服务器的nfs的连接,然后将43服务器上的课件拷贝到建立好的nfs上,再运行课件解析工具,解析整理好的excel即可完成课程的上传.在45服 ...
- 初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查
初入码田--ASP.NET MVC4 Web应用之创建一个空白的MVC应用程序 初入码田--ASP.NET MVC4 Web应用开发之一 实现简单的登录 2016-07-29 一.创建M002Adm ...