//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. “秒杀”问题的数据库和SQL设计【转载】

    “秒杀”问题的数据库和SQL设计 APRIL 21ST, 2015 问题的来源 完全不考虑一致性的方案 表结构 方案 存在的问题 保证单用户不会重复购买 解决超卖问题 方案 优化 提高性能了 鱼与熊掌 ...

  2. (第十周)Beta-2阶段成员贡献分

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...

  3. Invalid bound statement (not found): com.example.managerdemo.mapper.SingleTableMapper.selectAllValuesByConditionsNoPage

    报Invalid bound statement (not found): com.example.managerdemo.mapper.SingleTableMapper.selectAllValu ...

  4. eg_7

    1. 给定Map,根据Map中的值从大到小排列 package com.studentmanager.www; import java.util.ArrayList; import java.util ...

  5. 团队作业5-Alpha版本测试报告(彼岸芳华队)

    请根据团队项目中软件的需求文档.功能说明.系统设计和测试计划,写出软件的测试过程和测试结果,并回答下述问题. 一.在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个?(10分) 在测试过程 ...

  6. Scrum Meeting Beta - 5

    Scrum Meeting Beta - 5 NewTeam 2017/12/4 地点:主楼2楼走廊 任务反馈 团队成员 完成任务 计划任务 安万贺 完成了离线状态进入app的功能 实现离线状态读取本 ...

  7. eclipse+IDEA快捷键记录

    Eclipse中自动获取 IDEA中:ctrl+alt+v==alt+shift+l 其它   (有些地方前面的C代表Ctrl .S代表Shift.A代表Alt) Ctrl+Shift+F       ...

  8. [转帖] windows server 不同版本说明

    Windows Server 2016与Windows Server Current Version区别比较  http://365vcloud.net/2018/04/13/windows-serv ...

  9. 抽奖系统 random()

    random() 方法可返回介于 0 ~ 1 之间的一个随机数. document.write(parseInt(10*Math.random())); //输出0-10之间的随机整数document ...

  10. DataTable学习笔记 - 01

    DataTable 是 jQuery 的一个插件. 代码上来吧, <!DOCTYPE html> <html> <head> <meta charset=&q ...