//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*(生产者和消费者)的更多相关文章

  1. Linux进程通信之共享内存实现生产者/消费者模式

    共享内存 共享内存是内核为进程创建的一个特殊内存段,它将出现在进程自己的地址空间中,其它进程可以将同一段共享内存连接(attach)到自己的地址空间.这是最快的进程间通信方式,但是不提供任何同步功能( ...

  2. Centos下10000次循环测试php对Redis和共享内存(shm)读写效率

    redis和memcache还有共享内存都是读取内存的数据,为了测试一下到底效率谁更胜一筹,我在我的Centos虚拟机下做了一次公平的测试. 测试参数 环境:Centos (配置忽略).语言:PHP. ...

  3. C扩展 从共享内存shm到memcache外部内存

    引言 - ipc - shm 共享内存 本文会通过案例了解ipc 的共享内存机制使用, 后面会讲解C 如何使用外部内存服务memcached. 好先开始了解 linux 共享内存机制. 推荐先参看下面 ...

  4. [笔记]共享内存(shm)

    一.特点 共享内存允许多个不同的进程可以访问同一块内存.相较于其他IPC形式,具有速度快,效率高的特点,共享内存的存在降低了在大规模数据处理过程中内存的消耗. 二.创建共享内存 1.头文件 #incl ...

  5. vector存入共享内存(了解)

    昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到S ...

  6. linux使用共享内存通信的进程同步退出问题

    两个甚至多个进程使用共享内存(shm)通信,总遇到同步问题.这里的“同步问题”不是说进程读写同步问题,这个用信号量就好了.这里的同步问题说的是同步退出问题,到底谁先退出,怎么知道对方退出了.举个例子: ...

  7. C 共享内存封装

    引言 - 背景 2016 年写过一篇关于 linux 共享内存 shm api 扫盲文. C扩展 从共享内存shm到memcache外部内存 比较简单. 没有深入分析(能力有限, 也深入分析不了). ...

  8. Linux下IPC之共享内存的使用方法

    基本参考 <Unix环境高级编程>第14.9节共享内存来学习. 参考blog:https://blog.csdn.net/weixin_45794138/article/details/1 ...

  9. OS: 生产者消费者问题(二) ---- 系统V IPC通信-信号量和共享内存

    在上一篇“OS: 生产者消费者问题(多进程+共享内存+信号量)”中提到的方法二: 如果进程之间并没有父子关系,但是协商好了共享存储的 KEY , 那么在每个进程中,就可以通过 KEY 以及 shmge ...

随机推荐

  1. poweroff命令详解

    2019-02-17  基础命令学习目录首页   原文链接:https://www.cnblogs.com/Baron-Lu/p/6951297.html 在本篇中,我们会向你解释 shutdown. ...

  2. json转对象

    1,引入依赖 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib& ...

  3. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算 第二周

    一.结对对象 姓名:侯泽洋 学号:20172308 担任角色:驾驶员(侯泽洋) 伙伴第二周博客地址 二.本周内容 (一)继续编写上周未完成代码 1.本周继续编写代码,使代码支持分数类计算 2.相关过程 ...

  4. 自己对git的认识。

    刚打开这个软件的网页,只能用一个字来形容,蒙,蒙,蒙,重要的事要说三遍,全英文的,这到底是什么东西,连注册都得慢慢翻译,这英语基础实在是太差劲了. 看了老师推荐的对Git使用介绍,由于之前对这个软件的 ...

  5. 一致性Hash算法(KetamaHash)的c#实现

    Consistent Hashing最大限度地抑制了hash键的重新分布.另外要取得比较好的负载均衡的效果,往往在服务器数量比较少的时候需要增加虚拟节点来保证服务器能均匀的分布在圆环上.因为使用一般的 ...

  6. Hive如何加载和导入HBase的数据

    当我们用HBase 存储实时数据的时候, 如果要做一些数据分析方面的操作, 就比较困难了, 要写MapReduce Job. Hive 主要是用来做数据分析的数据仓库,支持标准SQL 查询, 做数据分 ...

  7. 动态语句SQL语句写法

    /*************************************************************************************************** ...

  8. curl 实例详解

    使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据 了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并 ...

  9. 有意思的Alias参数

    1. 最简单的方式,运行正常. PS C:\> Get-Service -Name BITS -ComputerName localhost 2. 自己构造一个对象,试图通过管道将主机名传递下去 ...

  10. docker中间件安装记录

    rabbitmq docker pull rabbitmq docker run --restart=on-failure: --name rabbitmq -d -p : -p : docker.i ...