实验10-共享内存实验_第1页
实验10-共享内存实验_第2页
实验10-共享内存实验_第3页
实验10-共享内存实验_第4页
实验10-共享内存实验_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论