#include<stdio.h>
#include<linux/sem.h>
#include<linux/shm.h>
#include<unistd.h>
#include<error.h>
#include<sys/types.h>
#include<time.h>#define MAXSHM 5   /*定义缓存区数组的下标变量个数*//******定义3个信号量的内部标识******/
int fullid;
int emptyid;
int mutexid;int main()
{/*定义信号量数据结构*/struct sembuf P,V;union semun arg;/*定义2个共享内存的ID*/int arrayid;int getid;/*定义共享内存虚拟地址*/int *array;int *get;/*创建共享内存*/arrayid=shmget(IPC_PRIVATE,sizeof(int)*MAXSHM,IPC_CREAT|0666);getid=shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666);/*初始化共享内存*/array=(int *)shmat(arrayid,0,0);get = (int *)shmat(getid,0,0);*get=0;/*创建信号量*/emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);mutexid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);/*初始化信号量*/arg.val=0;  /*初始时缓冲区中无数据*/if(semctl(fullid,0,SETVAL,arg)==-1) perror("semctl setval error");arg.val=MAXSHM;if(semctl(emptyid,0,SETVAL,arg)==-1) perror("semctl setval error");arg.val=1;if(semctl(mutexid,0,SETVAL,arg)==-1) perror("semctl setval error");/*定义P、V操作*/P.sem_num=0;P.sem_op=-1;P.sem_flg=SEM_UNDO;V.sem_num=0;V.sem_op=1;V.sem_flg=SEM_UNDO;/*生产者进程*/if(fork()==0){int i=0;int set=0;while(i<10){semop(emptyid,&P,1); /*对emptyid执行P操作*/semop(mutexid,&P,1);/*对mutexid执行P操作*/array[set%MAXSHM]=i+1;printf("Producer put number %d to NO. %d\n",array[set%MAXSHM],set%MAXSHM);set++;/*写计数加1*/semop(mutexid,&V,1);/*对mutexid执行V操作*/semop(fullid,&V,1);/*对fullid执行V操作*/i++;}sleep(3);/*睡眠3秒,等待消费者进程执行完毕*/printf("Producer is over\n");exit(0);}else{/*消费者A进程*/if(fork()==0){while(1){if(*get==10)break;semop(fullid,&P,1);/*对fullid执行P操作*/semop(mutexid,&P,1);/*对mutexid执行P操作*/printf("The ConsumerA get number from NO. %d",(*get)%MAXSHM);(*get)++;semop(mutexid,&V,1);/*对mutexid执行V操作*/semop(emptyid,&V,1); /*对emptyid执行V操作*/sleep(1);}printf("ConsumerA is over\n");exit(0);}else{/*消费者B进程*/if(fork()==0){while(1){if(*get==10)break;semop(fullid,&P,1);/*对fullid执行P操作*/semop(mutexid,&P,1);/*对mutexid执行P操作*/printf("The ConsumerB get number from NO. %d",(*get)%MAXSHM);(*get)++;semop(mutexid,&V,1);/*对mutexid执行V操作*/semop(emptyid,&V,1); /*对emptyid执行V操作*/sleep(1);}printf("ConsumerB is over\n");exit(0);}}}/*父进程返回后回收3个子进程*/wait(0);wait(0);wait(0);/*断开并撤销2个共享内存*/shmdt(array);shmctl(arrayid,IPC_RMID,0);shmdt(get);shmctl(getid,IPC_RMID,0);/*撤销3个信号量集*/semctl(emptyid,IPC_RMID,0);semctl(fullid,IPC_RMID,0);semctl(mutexid,IPC_RMID,0);return 0;
}

Linux相关——linux操作系统之生产者与消费者同步问题相关推荐

  1. 操作系统:生产者与消费者问题

    使用信号量实现生产者-消费者问题 问题描述:使用一个缓冲区来保存物品,只有缓冲区没有满,生产者才可以放入物品:只有缓冲区不为空,消费者才可以拿走物品. 因为缓冲区属于临界资源,因此需要使用一个互斥量 ...

  2. (二十三)操作系统-多生产者·多消费者问题

    文章目录 一.问题描述 二.问题分析 1. 关系分析 2. 整理思路 三.实现 1. 代码 2.如果不要互斥信号量 3. 将盘子(缓冲区)容量设为2 四.总结 一.问题描述   桌子上有一只盘子,每次 ...

  3. 操作系统之生产者与消费者

    生产者消费者模型描述 生产者/消费者问题可以描述为:两个或者更多的进程(线程)共享同一个缓冲区,其中一个或多个进程(线程)作为"生产者"会不断地向缓冲区中添加数据,另一个或者多个进 ...

  4. 操作系统—多生产者多消费者问题

    建议将思维导图保存下来观看,或者点击这里在线观看

  5. C#编写的多生产者多消费者同步问题

    // 多个生产者和多个消费者,能生产n个产品的情况using System; using System.Threading;public class HoldIntegerSynchronized{p ...

  6. Linux并发程序课程设计报告,网络操作系统课程设计--进程机制与并发程序设计-linux下生产者与消费者的问题实现.doc...

    网 络 操 作 系 统 课 程 设 计 网络操作系统课程设计 设计内容:进程机制与并发程序设计inux下生产者与消费者的问题实现进程机制与并发程序设计inux下生产者与消费者的问题实现 (1)掌握基本 ...

  7. 生产者和消费者(linux)

    生产者和消费者 同步 条件变量 条件变量的接口 简单实现一个生产者和一个消费者的模型 pthread_cond_wait 该接口为啥要使用互斥锁 等待接口的调用互斥锁的逻辑 等待接口的逻辑中,为啥要把 ...

  8. Linux操作系统实验:生产者和消费者问题

    一.实验目的及要求 "生产者消费者"问题是一个著名的同时性编程问题的集合.通过编写经典的"生产者消费者"问题的实验,读者可以进一步熟悉 Linux 中多线程编程 ...

  9. Linux 多线程编程(实现生产者消费者模型)

    Linux 多线程编程 线程分类 线程按照其调度者可以分为用户级线程和内核级线程两种. 内核级线程 在一个系统上实现线程模型的方式有好几种,因内核和用户空间提供的支持而有一定程度的级别差异.最简单的模 ...

最新文章

  1. 安防行业巨头都是如何布局无人机的?
  2. Hyper-v Server重复数据删除技术
  3. java blob压缩_如何从Oracle中用Java压缩的BLOB列中提取XML文档
  4. 【spring boot】【thymeleaf】SPEL调用静态方法和静态属性
  5. [3/21]Windows Server 2008时钟方面的改进展示
  6. laravel 集成采集_新版2020 Laravel采集网站程序
  7. PHP动态白云为背景的引导页-个人主页源码
  8. 火出B站的冠状病毒传播模拟仿真程序代码解析来啦!
  9. mysql错误Table ‘./mysql/proc’ is marked as crashed and should be repaired
  10. delphi 鼠标获取窗口句柄_Python 脚本自动对窗口进行截图
  11. ERP系统之JPJDE入门-1 JDE 简史
  12. SwiftyJSON的基本用法
  13. 破解tinypng文件上传的限制
  14. python字符串与url编码的转换
  15. 配置扩展IP ACL实验
  16. 51单片机之数据转移指令MOV、MOVX、MOVC等
  17. 阿里巴巴面试题及答案-持续更新(2)(2020年)
  18. em html字号,使用 em 来设置字体大小
  19. 解读SIM卡、USIM卡、UICC卡、eSIM卡的区别
  20. conda upgrade --all 中途退出后失败如何解决

热门文章

  1. Lasalle拉塞尔不变集原理解读(包含径向无界性的解读)
  2. Python如何克服从入门到放弃?
  3. Python在图片上绘制指定半径的圆
  4. Hyperledger Fabric v1.4(LTS) 系列(3.7):关键概念-Peers
  5. 利用几何画板来画出弧的中点
  6. python叠加等边三角形的绘制
  7. LINQ分组查询—GroupBy()
  8. 新员工入职管理与综合培训必备方案
  9. Akka 指南 之「Akka 简介」
  10. java如何判断一个数为质数?