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

下载本文档

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

文档简介

1、南昌大学实验报告学生姓名:王维学号:6100212202专业班级:网工 121班实验类型:口 验证 口综合口设计口 创新 实验日期:6/11实验成绩:一、 实验项目名称实验10:共享内存实验二、实验目的通过编写共享内存实验, 可以进一步了解使用共享内存的具体步骤,同时也进一步加深对共享内存的理解。在本实验中,采用信号量作为同步机制完善两个进程(“生产者”和“消费者”)之间的通信。其功能类似于“消息队列”中的实例。在实例中使用的与信号量相关 的函数。三、实验内容该实现要求利用共享内存实现文件的打开和读写操作。四、实验步骤(1)画出流程图 该实验流程图如图所示:流程图(2)编写代码下面是共享内存缓

2、冲区的数据结构的定义/* shm_com.h */#include #include #include #include #include #include #include #define SHM_BUFF_SZ 2048struct shm_buffint pid;char bufferSHM_BUFF_SZ;以下是信号量数据结构定义及其操作代码/* sem_com.h */#include #include #include union semunint val;struct semid_ds *buf;unsigned short *array;/*1.信号量初始化(赋值)函数 */i

3、nt init_sem(int sem_id, int init_value) /* 用 init_value 值作初值来初始化标识为 sem_id 的信号量)*/ union semun sem_union;sem_union.val = init_value; /* init_value 为初始值 */ if (semctl(sem_id, 0, SETVAL, sem_union) = -1) perror(Initialize semaphore error!);return -1;return 0;/* 2. 从系统中删除信号量的函数 */int del_sem(int sem_id

4、)union semun sem_union; if (semctl(sem_id, 0, IPC_RMID, sem_union) = -1) (perror(Delete semaphore error);return -1;return 0;/*3. P 操作函数*/int sem_p(int sem_id) (struct sembuf sem_b;sem_b.sem_num = 0; /*单个信号量的编号应该为0 */sem_b.sem_op = -1; /* 表示 P 操彳乍 */sem_b.sem_flg = SEM_UNDO; /*系统自动释放将会在系统中残留的信号量*/if

5、(semop(sem_id, &sem_b, 1) = -1) (perror(P operation error);return -1;return 0;/* 4. V 操作函数*/int sem_v(int sem_id) (struct sembuf sem_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(V oper

6、ation error);return -1; return 0;以下是“生产者”部分代码/* producer.c */#include shm_com.h#include sem_com.h#include int ignore_signal(void)*/*忽略一些信号,免得非法退出程序signal(SIGINT, SIG_IGN);signal(SIGSTOP, SIG_IGN);signal(SIGQUIT, SIG_IGN);return 0;int main() void *shared_memory = NULL;struct shm_buff *shm_buff_inst;c

7、har bufferBUFSIZ;int shmid, semid;ignore_signal(); /*防止程序非正常退出 */*定义信号量,用于实现访问共享内存的进程之间的互斥*/semid = semget(ftok(.,a),1,0666|IPC_CREAT);/* 创建一个信号量 */if(semid=-1) perror(semget error!);exit(1);if(init_sem(semid,1) = -1)/* 初始值为 1*/ perror(sem_init error!);del_sem(semid);exit(1);/*创建共享内存 */shmid = shmge

8、t(ftok(., b), sizeof(struct shm_buff), 0666|IPC_CREAT) ;if (shmid = -1)perror(shmget failed);del_sem(semid);exit(1);/*将共享内存地址映射到当前进程地址空间*/shared_memory = shmat(shmid, (void*)0, 0);if (shared_memory = (void*)-1)(perror(shmat error);del_sem(semid);exit(1);printf(Memory attached at %Xn, (int)shared_mem

9、ory);/*获得共享内存的映射地址*/shm_buff_inst = (struct shm_buff *) shared_memory;do(sem_p(semid);printf(Enter some text to the shared memory(enter quit to exit):);/*向共享内存写入数据*/if (fgets(shm_buff_inst-buffer, SHM_BUFF_SZ, stdin) = NULL) (perror(fgets error);sem_v(semid);break;shm_buff_inst-pid = getpid();sem_v(

10、semid); while(strncmp(shm_buff_inst-buffer, quit, 4) != 0);/*删除信号量*/del_sem(semid);/*删除共享内存到当前进程地址空间中的映射*/if (shmdt(shared_memory) = 1)(perror(shmdt error);exit(1);exit(0);以下是“消费者”部分代码/* customer.c */#include shm_com.h#include sem_com.hint main() void *shared_memory = NULL;struct shm_buff *shm_buff_

11、inst;int shmid, semid;/*获得信号量*/semid = semget(ftok(., a),1,0666);if (semid = -1)(perror(Producer isnt exist);exit(1);/*获得共享内存*/shmid = shmget(ftok(., b), sizeof(struct shm_buff), 0666|IPC_CREAT);if (shmid = -1)(perror(shmget);exit(1);/*将共享内存地址映射到当前进程地址空间*/shared_memory = shmat(shmid, (void*)0, 0);if

12、 (shared_memory = (void*)-1)(perror(shmat);exit(1);printf(Memory attached at %Xn,(int)shared_memory);/*获得共享内存的映射地址*/shm_buff_inst = (struct shm_buff *)shared_memory;do(sem_p(semid);printf(Shared memory was written by process %d :%s,shm_buff_inst-pid, shm_buff_inst-buffer);if (strncmp(shm_buff_inst-b

13、uffer, 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) perror(shmctl(IPC_RMID);exit(1);exit(0);.编译produ

14、cer.c和customer.c并运行,记录结果,完成实验报告.若将消费者部分中的代码“sleep(2);”这行删除,重新编译运行,会出什么情况?解释你看到的实验结果。五、实验结果打开两个终端,终端1:jsllylocalhost bin5 ./producerMemory attached Enter some text Enter some text Enter some textat to to to797AOOO the shared the shared the sharedjellyGlocalhcst binSmemory(enter memory(enter memory(en

15、terrquit* to exit) :hello rqu.it to exit) :world rqu.it * to exit) : quit终端2:jLlyGloeaLhost bin$ ./eustom&rMemouy attached at 32053000Shared msitiory wa.s writt&n fay process 3132:world:quitShared memory was written by process 3132Shared memory was writt&n hy process 313-2 jellyG locaIhost- bin $六、实验总结共享内存是System V的三种IPC类型之一。共享内存是最快的一种IPC方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论