生产者一直在往共享内存中写数据

#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操作、共享内存)相关推荐

  1. java信号量生产者_java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  2. clients(PV操作共享内核内存进行输入输出分屏) - server(进程间通信)模型实现...

    1.拓扑结构 2.PV操作共享内核内存进行输入输出分屏 (1) 1 int semop(int semid,struct sembuf *sops,size_t nsops): 功能描述 操作一个或一 ...

  3. java多线程之生产者和消费者问题

    线程通信:不同的线程执行不同的任务,如果这些任务有某种关系,线程之间必须能够通信,协调完成工作. 经典的生产者和消费者案例(Producer/Consumer): 分析案例: 1):生产者和消费者应该 ...

  4. Linux学习之系统编程篇:shm 共享内存及其操作函数

    一.shm 和 mmap 的区别 (1)mmap 是在磁盘上建立一个文件,每个进程地址空间中开辟出一块空间进行映射.shm 每个进程最终会映射到同一块物理内存.shm 保存在物理内存,这样读写的速度最 ...

  5. linux 共享内存操作(shm_open、mmap、编译链接库:-lz -lrt -lm -lc都是什么库)

    文章目录 linux 共享内存操作(shm_open) 一.背景 二.函数使用说明 shm_open ftruncate(改变文件大小) mmap共享内存 三.示例代码 创建内存共享文件并写入数据 打 ...

  6. linux进程间的通信(C): 共享内存

    一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...

  7. 两个进程共享内存,一个写,一个读

    要求是:生产者进程生成Catalan序列,并将其写入到内存共享对象.消费者进程从共享内存中读取并输出序列.生产者进程要在命令行指定生成Catalan数的数目.例如,命令行指定5,说明生产者进程会生成5 ...

  8. 进程间通信IPC(二)(共享内存、信号、信号量)

    共享内存: 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更 ...

  9. OS_process_sync_producercomsumer进程同步/互斥/信号量管程:临界资源/临界区:生产者和消费者问题(缓冲池(缓冲区)问题)

    文章目录 OS_process_sync_producer&comsumer reference 临界资源 (Critical Resouce) 代码的划分 临界区(critical sect ...

  10. 进程间通信方式(三)-- IPC对象(消息队列、共享内存、信号灯集)

    IPC对象 1. IPC对象 2. 查看IPC对象命令 3. 消息队列 3.1 概念 3.2 相关函数 3.2.1 msgget() 创建或者打开消息队列 3.2.2 ftok() 获取键值 3.2. ...

最新文章

  1. 最新版,别的可以不用看了,zabbix 监控 esxi
  2. 《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度
  3. 甘肃关于领取软考2021年上半年合格证书的通知
  4. linux内核模块开发
  5. 富文本编辑器 CKeditor 配置使用
  6. php json_encode 中文乱码解决方法
  7. java之tomcat搭建文件服务器
  8. 快速傅里叶变换FFT(一维)
  9. Cadence PSpice 仿真4:共射极运放静态工作点仿真图文教程
  10. 虾皮的注册流程是什么?怎么注册虾皮?
  11. Elasticsearch 分布式搜索引擎 -- 数据聚合(聚合的种类、DSL实现聚合、RestAPI实现聚合)
  12. 绝对值abs为负数引发的神秘滑行
  13. 键盘输入一个高精度的正整数n,去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数最小
  14. 访问国内网站提示无法访问
  15. 作业5 | AR模型参数的估计
  16. LOSER_____________实现一到九的乘法表列
  17. iView框架Select组件
  18. 赛码行测题库_行测题库:行测数字推理模拟题2.22
  19. 【干货1】如何写好产品需求规格说明书(PRD)
  20. 石墨文档详细教程(云端office支持阿里巴巴钉钉,微信)-Array老师-专题视频课程...

热门文章

  1. 2020年最新放假通知
  2. Monkey-介绍、优势、操作步骤、中止monkey、
  3. Jemer安装问题总结及实例
  4. location.search是什么意思?怎么用?
  5. 河北省计算机学业水平测试,河北新高考重要通知!高中学业水平考试这样考
  6. 乐信,转向路口的横风
  7. #微积分#莱布尼茨公式
  8. LeanBack:HorizontalGridView和VerticalGridView使用详解
  9. 加密技术——数字签名与数字加密过程概述
  10. 毕业之后,人生才扑面而来