生产者和消费者(PV操作、共享内存)
生产者一直在往共享内存中写数据
#include<sys/sem.h>
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include"shm.h"int main()
{int ret;int shmid;int semid;int running;void *share_memory;struct shm *shm_buf;//创建信号量semid = semget(ftok(".",'a'),1,IPC_CREAT);if(semid < 0){perror("semid:");exit(1);}//初始化信号量sem_init(semid,1);//创建共享内存shmid = shmget(ftok(".",'b'),sizeof(struct shm),IPC_CREAT);if(shmid < 0){perror("shmget:");exit(1);}//映射共享内存share_memory = shmat(shmid,NULL,0);if(share_memory == (void *)-1){perror("shmat:");sem_del(semid);exit(1);}printf("share_memory = %p\n",share_memory);//指向共享内存shm_buf = (struct shm*)share_memory;while(running){p_sem(semid);//printf("please input something to memory:\n");scanf("%s",&shm_buf->buf);shm_buf->flag = getpid();if(strcmp(shm_buf->buf,"end") == 0){running = 0;}v_sem(semid);//做加法}sem_del(semid);if(shmdt(share_memory) == -1){perror("shmdt:");exit(1);}return 0;
}
消费者一直从内存中读取数据,一次读完之后就把内存清空
#include<sys/sem.h>
#include<sys/shm.h>
#include<sys/fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/types.h>
#include"shm.h"int main()
{struct shm *shm_buf;void *share_memory;int semid;int shmid;int running = 1;
//创建信号量,生产者和消费者的key值要对应相等semid = semget(ftok(".",'a'),1,0666);if(semid == -1){perror("producer do not exit:");exit(1);} shmid = shmget(ftok(".",'b'),sizeof(struct shm),IPC_CREAT);if(shmid == -1){perror("shmget error:");exit(1);}share_memory = shmat(shmid,NULL,0);if(share_memory == (void *)-1){perror("shmat failed:");exit(1);}printf("share_memory = %p\n",share_memory);shm_buf = (struct shm*)share_memory;while(running){p_sem(semid); printf("process write memory %d: %s\n",shm_buf->flag,shm_buf->buf);if(strcmp(shm_buf->buf,"end") == 0){//running = 0;exit(1);}shm_buf->flag = 0;memset(shm_buf->buf,0,BUF_SIZE);v_sem(semid);}if(shmdt(share_memory) == -1){perror("share_memory:");exit(1);}if(shmctl(shmid,IPC_RMID,NULL) == -1){perror("shmctl:");exit(1);}exit(0);
}
头文件:
#include<sys/sem.h>
#include<sys/shm.h>
#include<sys/fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/types.h>
#include"shm.h"int main()
{struct shm *shm_buf;void *share_memory;int semid;int shmid;int running = 1;semid = semget(ftok(".",'a'),1,0666);if(semid == -1){perror("producer do not exit:");exit(1);} shmid = shmget(ftok(".",'b'),sizeof(struct shm),IPC_CREAT);if(shmid == -1){perror("shmget error:");exit(1);}share_memory = shmat(shmid,NULL,0);if(share_memory == (void *)-1){perror("shmat failed:");exit(1);}printf("share_memory = %p\n",share_memory);shm_buf = (struct shm*)share_memory;while(running){p_sem(semid); printf("process write memory %d: %s\n",shm_buf->flag,shm_buf->buf);if(strcmp(shm_buf->buf,"end") == 0){//running = 0;exit(1);}shm_buf->flag = 0;memset(shm_buf->buf,0,BUF_SIZE);v_sem(semid);}if(shmdt(share_memory) == -1){perror("share_memory:");exit(1);}if(shmctl(shmid,IPC_RMID,NULL) == -1){perror("shmctl:");exit(1);}exit(0);
}
重写的pv操作、删除信号量和初始化信号量的函数
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdlib.h>
#include<sys/sem.h>#include"shm.h"int sem_init(int semid,int pid)
{union semnum sem_num;sem_num.pid = pid;if(semctl(semid,0,SETVAL,sem_num) == -1){perror("fail sem_init");exit(1);}return 0;
}int sem_del(int semid)
{union semnum sem_num;if(semctl(semid,0,IPC_RMID,sem_num) == -1){perror("fail sem_del:");exit(1);}return 0;
}int p_sem(int semid)
{struct sembuf sem;sem.sem_num = 0;sem.sem_op = -1;sem.sem_flg = SEM_UNDO;if(semop(semid,&sem,1) == -1){perror("fail to p:");exit(1);}return 0;
}
生产者和消费者(PV操作、共享内存)相关推荐
- java信号量生产者_java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- clients(PV操作共享内核内存进行输入输出分屏) - server(进程间通信)模型实现...
1.拓扑结构 2.PV操作共享内核内存进行输入输出分屏 (1) 1 int semop(int semid,struct sembuf *sops,size_t nsops): 功能描述 操作一个或一 ...
- java多线程之生产者和消费者问题
线程通信:不同的线程执行不同的任务,如果这些任务有某种关系,线程之间必须能够通信,协调完成工作. 经典的生产者和消费者案例(Producer/Consumer): 分析案例: 1):生产者和消费者应该 ...
- Linux学习之系统编程篇:shm 共享内存及其操作函数
一.shm 和 mmap 的区别 (1)mmap 是在磁盘上建立一个文件,每个进程地址空间中开辟出一块空间进行映射.shm 每个进程最终会映射到同一块物理内存.shm 保存在物理内存,这样读写的速度最 ...
- linux 共享内存操作(shm_open、mmap、编译链接库:-lz -lrt -lm -lc都是什么库)
文章目录 linux 共享内存操作(shm_open) 一.背景 二.函数使用说明 shm_open ftruncate(改变文件大小) mmap共享内存 三.示例代码 创建内存共享文件并写入数据 打 ...
- linux进程间的通信(C): 共享内存
一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...
- 两个进程共享内存,一个写,一个读
要求是:生产者进程生成Catalan序列,并将其写入到内存共享对象.消费者进程从共享内存中读取并输出序列.生产者进程要在命令行指定生成Catalan数的数目.例如,命令行指定5,说明生产者进程会生成5 ...
- 进程间通信IPC(二)(共享内存、信号、信号量)
共享内存: 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更 ...
- OS_process_sync_producercomsumer进程同步/互斥/信号量管程:临界资源/临界区:生产者和消费者问题(缓冲池(缓冲区)问题)
文章目录 OS_process_sync_producer&comsumer reference 临界资源 (Critical Resouce) 代码的划分 临界区(critical sect ...
- 进程间通信方式(三)-- IPC对象(消息队列、共享内存、信号灯集)
IPC对象 1. IPC对象 2. 查看IPC对象命令 3. 消息队列 3.1 概念 3.2 相关函数 3.2.1 msgget() 创建或者打开消息队列 3.2.2 ftok() 获取键值 3.2. ...
最新文章
- 最新版,别的可以不用看了,zabbix 监控 esxi
- 《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度
- 甘肃关于领取软考2021年上半年合格证书的通知
- linux内核模块开发
- 富文本编辑器 CKeditor 配置使用
- php json_encode 中文乱码解决方法
- java之tomcat搭建文件服务器
- 快速傅里叶变换FFT(一维)
- Cadence PSpice 仿真4:共射极运放静态工作点仿真图文教程
- 虾皮的注册流程是什么?怎么注册虾皮?
- Elasticsearch 分布式搜索引擎 -- 数据聚合(聚合的种类、DSL实现聚合、RestAPI实现聚合)
- 绝对值abs为负数引发的神秘滑行
- 键盘输入一个高精度的正整数n,去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数最小
- 访问国内网站提示无法访问
- 作业5 | AR模型参数的估计
- LOSER_____________实现一到九的乘法表列
- iView框架Select组件
- 赛码行测题库_行测题库:行测数字推理模拟题2.22
- 【干货1】如何写好产品需求规格说明书(PRD)
- 石墨文档详细教程(云端office支持阿里巴巴钉钉,微信)-Array老师-专题视频课程...