版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验10共享内存实验1.实验目的通过编写共享内存实验,可以进一步了解使用共享内存的具体步骤,同时也进一步加深对共享内存的理解。在本实验中,采用信号量作为同步机制完善两个进程〔“生产者〞和“消费者〞〕之间的通信。其功能类似于“消息队列〞中的实例。在实例中使用的与信号量相关的函数。2.实验内容该实现要求利用共享内存实现文件的翻开和读写操作。3.实验步骤〔1〕画出流程图该实验流程图如下图:流程图〔2〕编写代码下面是共享内存缓冲区的数据结构的定义/*shm_com.h*/#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineSHM_BUFF_SZ2048structshm_buff{intpid;charbuffer[SHM_BUFF_SZ];};以下是信号量数据结构定义及其操作代码/*sem_com.h*/#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>unionsemun{intval;structsemid_ds*buf;unsignedshort*array;};/*1.信号量初始化〔赋值〕函数*/intinit_sem(intsem_id,intinit_value)/*用init_value值作初值来初始化标识为sem_id的信号量〕*/{unionsemunsem_union;sem_union.val=init_value;/*init_value为初始值*/if(semctl(sem_id,0,SETVAL,sem_union)==-1){perror("Initializesemaphoreerror!");return-1;}return0;}/*2.从系统中删除信号量的函数*/intdel_sem(intsem_id){unionsemunsem_union;if(semctl(sem_id,0,IPC_RMID,sem_union)==-1){perror("Deletesemaphoreerror");return-1;}return0;}/*3.P操作函数*/intsem_p(intsem_id){structsembufsem_b;sem_b.sem_num=0;/*单个信号量的编号应该为0*/sem_b.sem_op=-1;/*表示P操作*/sem_b.sem_flg=SEM_UNDO;/*系统自动释放将会在系统中残留的信号量*/if(semop(sem_id,&sem_b,1)==-1){perror("Poperationerror");return-1;}return0;}/*4.V操作函数*/intsem_v(intsem_id){structsembufsem_b;sem_b.sem_num=0;/*单个信号量的编号应该为0*/sem_b.sem_op=1;/*表示V操作*/sem_b.sem_flg=SEM_UNDO;/*系统自动释放将会在系统中残留的信号量*/if(semop(sem_id,&sem_b,1)==-1){perror("Voperationerror");return-1;}return0;}以下是“生产者〞局部代码/*producer.c*/#include"shm_com.h"#include"sem_com.h"#include<signal.h>intignore_signal(void){/*忽略一些信号,免得非法退出程序*/signal(SIGINT,SIG_IGN);signal(SIGSTOP,SIG_IGN);signal(SIGQUIT,SIG_IGN);return0;}intmain(){void*shared_memory=NULL;structshared_use_st*shm_buff_inst;charbuffer[BUFSIZ];intshmid,semid;ignore_signal();/*防止程序非正常退出*//*定义信号量,用于实现访问共享内存的进程之间的互斥*/semid=semget(ftok(".",'a'),1,0666|IPC_CREAT);/*创立一个信号量*/if(semid==-1){perror("semgeterror!");exit(1);}if(init_sem(semid,1)==-1)/*初始值为1*/{perror("sem_initerror!");del_sem(semid);exit(1);}/*创立共享内存*/shmid=shmget(ftok(".",'b'),sizeof(structshared_use_st),0666|IPC_CREAT);if(shmid==-1){perror("shmgetfailed");del_sem(semid);exit(1);}/*将共享内存地址映射到当前进程地址空间*/shared_memory=shmat(shmid,(void*)0,0);if(shared_memory==(void*)-1){perror("shmaterror");del_sem(semid);exit(1);}printf("Memoryattachedat%X\n",(int)shared_memory);/*获得共享内存的映射地址*/shm_buff_inst=(structshared_use_st*)shared_memory;do{sem_p(semid);printf("Entersometexttothesharedmemory(enter'quit'toexit):");/*向共享内存写入数据*/if(fgets(shm_buff_inst->buffer,SHM_BUFF_SZ,stdin)==NULL){perror("fgetserror");sem_v(semid);break;}shm_buff_inst->pid=getpid();sem_v(semid);}while(strncmp(shm_buff_inst->buffer,"quit",4)!=0);/*删除信号量*/del_sem(semid);/*删除共享内存到当前进程地址空间中的映射*/if(shmdt(shared_memory)==1){perror("shmdterror");exit(1);}exit(0);}以下是“消费者〞局部代码/*customer.c*/#include"shm_com.h"#include"sem_com.h"intmain(){void*shared_memory=NULL;structshared_use_st*shm_buff_inst;intshmid,semid;/*获得信号量*/semid=semget(ftok(".",'a'),1,0666);if(semid==-1){perror("Produceris'ntexist");exit(1);}/*获得共享内存*/shmid=shmget(ftok(".",'b'),sizeof(structshared_use_st),0666|IPC_CREAT);if(shmid==-1){perror("shmget");exit(1);}/*将共享内存地址映射到当前进程地址空间*/shared_memory=shmat(shmid,(void*)0,0);if(shared_memory==(void*)-1){perror("shmat");exit(1);}printf("Memoryattachedat%X\n",(int)shared_memory);/*获得共享内存的映射地址*/shm_buff_inst=(structshared_use_st*)shared_memory;do{sem_p(semid);printf("Sharedmemorywaswrittenbyprocess%d:%s",shm_buff_inst->pid,shm_buff_inst->buffer);if(strncmp(shm_buff_inst->buffer,"quit",4)==0){break;}shm_buff_inst->pid=0;memset(shm_buff_inst->buffer,0,SHM_BUFF_SZ);sem_v(semid);sleep(2);}while(1);/*删除共享内存到当前进程地址空间中的映射*/if(shmdt(shared_memory)==-1){perror("shmdt");exit(1);}/*删除共享内存*/if(shmctl(shmid,IPC_RMID,NULL)==-1){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026京能集团总部部门副职及所属企业副总经理招聘5人备考题库附参考答案详解(a卷)
- 2026中建玖玥城市运营公司招聘2人备考题库(北京)完整答案详解
- 2026上半年贵州事业单位联考毕节市七星关区招聘377人备考题库及答案详解(历年真题)
- 2026广东东莞市石碣镇招聘编外聘用人员5人备考题库带答案详解(夺分金卷)
- 2026吉林工商学院招聘高层次人才及博士人才67人备考题库附答案详解(a卷)
- 2026上半年安徽事业单位联考池州市招聘63人备考题库附参考答案详解ab卷
- 2026内蒙古鄂尔多斯伊金霍洛旗高级中学分校招聘1人备考题库含答案详解
- 2026上半年贵州事业单位联考仁怀市招聘77人备考题库含答案详解(典型题)
- 2026中国共产党平果市委员会党校城镇公益性岗位人员招聘1人备考题库(广西)附答案详解(培优a卷)
- 2026在京全国性宗教团体应届高校毕业生招聘16人备考题库及参考答案详解一套
- 工装夹具验收单
- 循环水冷却系统安全操作及保养规程
- 安徽永牧机械集团有限公司年产10000吨钢结构加工项目环境影响报告表
- QSY136-2023年生产作业现场应急物资配备选用指南
- GB/T 20946-2007起重用短环链验收总则
- GB/T 1040.3-2006塑料拉伸性能的测定第3部分:薄膜和薄片的试验条件
- 制造生产月度报告
- 2022年孝感汉川市教师进城考试笔试题库及答案解析
- ISO9001、ISO14001、QC080000质量体系程序文件大全
- 呼吸治疗毕业论文题目
- 护理责任组长的竞聘
评论
0/150
提交评论