- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统实验通信
实验二Linux进程同步与通信
【关键问题】
一个生产者向一个缓冲区发消息,每当发出一个消息后,要等待三个消费者都接收这条消息后,生产者才能发送新消息。用信号量和P、V操作,写出他们同步工作的程序。
【设计思路】
首先声明7个信号灯ID,他们分别是full1,full2,full3,empty1,empty2,empty3,mutxid;用函数mmap()创建虚拟主存区array,brray,set,get,bet;初始化变量get,set,bet;通过函数semget()分别创建各信号量full1,full2,full3,empty1,empty2,empty3,mutxid,并用函数semctl()为各信号量赋初值full1=1,full2=1,full3=1,empty1=0,empty2=0,empty3=0,mutxid=1;然后初始化P,V操作;在主函数中创建一个生产者进程,在创建三个消费者进程;通过P,V操作,生产者进程向缓冲区发送一个消息(三个数据),当三个消费者进程都接受到这条消息时,生产者才能再次先缓冲区从新发送消息,如此循环。
【关键代码】
#include sys/mman.h
#include sys/types.h
#include linux/sem.h
#include fcntl.h
#include unistd.h
#include stdio.h
#include errno.h
#include time.h
#define MAXSEM 1
//声明三个信号灯ID
int full1;
int full2;
int full3;
int empty1;
int empty2;
int empty3;
int mutxid;
int main()
{
struct sembuf P,V; //对信号量操作时需要的数据结构
union semun arg; //对信号量操作时需要的数据结构
//声明虚拟主存
int *array;
int *brray;
int *set;
int *get;
int *bet;
//创建虚拟主存。即变量作为共享虚拟主存实现。
array = (int *)mmap(NULL , sizeof( int )* MAXSEM,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
get = (int *)mmap(NULL , sizeof( int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
set = (int *)mmap(NULL , sizeof( int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
bet = (int *)mmap(NULL , sizeof( int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
//初始化变量
*get = 0;
*bet = 0;
*set = 0;
//创建信号量
full1= semget(IPC_PRIVATE,1,IPC_CREAT|00666); //该信号量用于消费者获取数据
full2= semget(IPC_PRIVATE,1,IPC_CREAT|00666); //该信号量用于消费者获
full3= semget(IPC_PRIVATE,1,IPC_CREAT|00666); //该信号量用于消费者获
empty1=semget(IPC_PRIVATE,1,IPC_CREAT|00666); //该信号量用于生产者获空闲缓冲区
empty2=semget(IPC_PRIVATE,1,IPC_CREAT|00666); //该信号量用于生产者获
empty3=semget(IPC_PRIVATE,1,IPC_CREAT|00666); //该信号量用于生产者获
mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|00666); //该信号量用于对缓冲区的互斥
//为信号灯赋初值
arg.val = 1;
if(semctl(full1, 0 , SETVAL , arg) == -1) perror(semctl setval error);
arg.val = 1;
if(semctl(full2 , 0 ,SETVAL , arg) == -1) perror(semctl setval error);
您可能关注的文档
最近下载
- Y Y-T 1118-2001 石膏绷带 粘胶型.pdf VIP
- 中职语文《江姐》(节选) 知识清单.docx VIP
- 绝望的主妇经典台词1-8季中英对照.pdf VIP
- 华力液压模块车(SPMT)使用说明书.pdf VIP
- 2025年保安员(初级)考试模拟100题(含答案) .pdf VIP
- 2024四年级上册语文课课贴(彩虹版).pdf VIP
- GZ055 环境艺术设计赛项赛题15套-2023年全国职业院校技能大赛赛项赛题 .pdf VIP
- 12小学体育二年级课程纲要.doc VIP
- 粘胶型石膏绷带产品技术要求2023完整版.docx VIP
- 2025-2026学年初中数学七年级上册(2024)华东师大版(2024)教学设计合集.docx
文档评论(0)