共享内存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 ...
随机推荐
- 深入理解JavaScript函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...
- (转)一个简单的rest_framework demo
转发:https://www.cnblogs.com/fu-yong/p/9100559.html models.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from ...
- iOS - Bundle 资源文件包生成和常见资源文件使用
1.Bundle 文件 Bundle 文件,就是资源文件包.我们将许多图片.XIB.文本文件组织在一起,打包成一个 Bundle 文件.方便在其他项目中引用包内的资源. Bundle 文件是静态的,也 ...
- 王者荣耀交流协会final发布文案美工展示博客
logo: 我们的logo是蓝底白字,非常简洁大气的设计感,上面印有我们的软件名称,更好的直观的彰显了我们的主题.我们的软件就是要迎合使用者,给使用者更加方便快捷的工作体验,更好的衡量自己的时间分配. ...
- Daily Scrumming* 2015.10.26(Day 7)
一.总体情况总结 今天我们开会具体讨论了一下接下来的任务.还详细讨论了一下分数的分配,具体分数分配我们会在下一篇博客中详细说明. 我们下一周大致的工作安排如下: 1.UI:完成社团后台界面的设计,以及 ...
- PAT 1053 住房空置率
https://pintia.cn/problem-sets/994805260223102976/problems/994805273284165632 在不打扰居民的前提下,统计住房空置率的一种方 ...
- sql update set from 的用法 (转)
关键字: update set from 下面是这样一个例子: 两个表a.b,想使b中的memo字段值等于a表中对应id的name值 表a:id, name 1 ...
- 关于JEE web项目 Servlet中 “/” 的解释 ;
1.关于"/" 可以代表web应用的根目录,也可以代表站点的根目录: 1>如果交给浏览器解析,则代表web站点的根目录,如果交给web服务器解析则代表项目的根目录: 2> ...
- CentOS7无法使用tab补全功能??
Centos7在使用最小化安装的时候,没有安装自动补全的包,需要自己手动安装. yum -y install bash-completion 或者你可以安装一些初始化的包组 yum -y groupi ...
- DataTable学习笔记 - 01
DataTable 是 jQuery 的一个插件. 代码上来吧, <!DOCTYPE html> <html> <head> <meta charset=&q ...