版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027年赣江智能制造学院单招综合素质考试模拟试卷带答案详解(完整版)
- 计算机三级网络刷题懵逼快速破局技巧
- 2024年陕西丝路文旅职业学院高职单招职业适应性测试考试题库附完整答案详解【考点梳理】
- 2025年湘宏职业学院单招综合素质考试模拟试卷及答案详解
- 2024年安徽长江职业学院高职单招职业技能考试题库【有一套】附答案详解
- 2025年殷墟文化职业学院高职单招职业适应性测试考试模拟试卷【学生专用】附答案详解
- 2026年新能源车用高温气冷堆创新应用报告
- 2027年湖南省邵阳市单招职业技能考试题库(原创题)附答案详解
- 2025年重庆市巫溪县单招综合素质考试题库含答案详解【考试直接用】
- 中学消防安全教育课件
- 心脏性猝死高危人群风险分层
- 玻璃雨棚施工组织设计
- 2025-2026学年人教高一英语上学期期末必刷常考题之阅读理解
- 2026中国医疗建筑抗震设计标准与改造方案报告
- 2025年全国高考数学二卷真题解析及试题答案
- 2025至2030中国石油管道用钢型材防腐技术升级研究报告
- 青岛市科技成果转化概念验证平台备案试点建设申报书
- 2026年幕墙工程施工合同(外墙·质保版)
- 2026规范版离婚协议书
- 招行客户经理面试技巧与常见问题解答
- GB/T 26952-2025焊缝无损检测磁粉检测验收等级
评论
0/150
提交评论