




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、西南交通大学操作系统试验四进程间的通信:共享内存上课地点:7105上课学期:大二下学期班级:软件4班学生学号:2014112208姓名:侯正罡任课教师:胡晓鹏实验日期:2016.5.10实验名称:进程间的通信:共享内存实验目的:1 .学习Linux多进程通信的一种方式:共享内存2 .学习若干可以产生信号,接受信号的函数。实验内容:一、什么是共享内存(内容来自博客)共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。二、共享内存的使得(内容来自博客)与信号量一样,在Linu
2、x中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件sys/shm.h中。1、shmget函数该函数用来创建共享内存,它的原型为:intshmget(key_tkey,size_tsize,intshmflg)第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,
3、程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符(shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。第二个参数,size以字节为单位指定需要共享的内存容量第三个参数,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入
4、数据,同时其他用户创建的进程只能读取共享内存。2、shmat函数第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。它的原型如下:void*shmat(intshm_id,constvoid*shm_addr,intshmflg);第一个参数,shm_id是由shmget函数返回的共享内存标识。第二个参数,shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。第三个参数,shm_flg是一组标志位,通常为0o调用成功时返回一个指向共享内存第一个字节的指针,如果调用失
5、败返回-1.3、shmdt函数该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。它的原型如下:intshmdt(constvoid*shmaddr);参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.4、shmctl函数与信号量的semctl函数一样,用来控制共享内存,它的原型如下:intshmctl(intshm_id,intcommand,structshmid_ds*buf);第一个参数,shm_id是shmget函数返回的共享内存标识符。第二个参数,command是要采取的操作,它可以取下面的三
6、个值:IPC_STAT把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。IPC_SET如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值IPC_RMID删除共享内存段第三个参数,buf是一个结构指针,它指向共享内存模式和访问权限的结构。shmid_ds结构至少包括以下成员:structshmid_dsuid_tshm_perm.uid;uid_tshm_perm.gid;mode_tshm_perm.mode;三、共享内存的使用#include<stdio.h>#include<unis
7、td.h>#include<sys/ipc.h>#include<sys/shm.h>#defineMY_SHM_ID67483intmain()(/获得系统中页面的大小printf("pagesize=%dn",getpagesize();创建一个共享内存区段intshmid,ret;shmid=shmget(MY_SHM_ID,4096,0666|IPC_CREAT);创建了一个4KB大小共享内存区段。指定的大小必须是当前系统中页面大小的整数倍if(shmid>0)printf("Createasharedmemoryseg
8、ment%dn",shmid);/获得一个内存区段的信息structshmid_dsshmds;/shmid=shmget(MY_SHM_ID,0,0);/示例怎样获得一个共享内存的标识符ret=shmctl(shmid,IPC_STAT,&shmds);if(ret=0)printf("Sizeofmemorysegmentis%dn",(int)shmds.shm_segsz);printf("Numbreofattaches%dn",(int)shmds.shm_nattch);elseprintf("shmctl()c
9、allfailedn");删除该共享内存区ret=shmctl(shmid,IPC_RMID,0);if(ret=0)printf("Sharedmemoryremovedn");elseprintf("Sharedmemoryremovefailedn");return0;X-博市文件汗】,蜡曰再看(V甩案出,堵市E酹斯hoohoo-In5piron-S547:gccneirory.c-onemory-Imhoohoo-Insptron-5547;$./nemcrypageCreateasharedmewarysegment3407882Si
10、zeofPierrorysegmentts4096Numbreofattaches0Sharedmenoryremovedhoohoo-Insptron-S547:-$|#include<stdio.h>#include<unistd.h>#include<string.h>#include<sys/ipc.h>#include<sys/shm.h>#include<error.h>#defineSIZE1024intmain()intshmid;char*shmaddr;structshmid_dsbuf;intflag
11、=0;intpid;shmid=shmget(IPC_PRIVATE,SIZE,IPC_CREAT|0600);if(shmid<0)perror("getshmipc_iderror");return-1;pid=fork();if(pid=0)shmaddr=(char*)shmat(shmid,NULL,0);if(*(int*)shmaddr=-1)perror("shmataddrerror");return-1;strcpy(shmaddr,"Hi,Iamchildprocess!n");shmdt(shmaddr)
12、;return0;elseif(pid>0)sleep(3);flag=shmctl(shmid,IPC_STAT,&buf);if(flag=-1)perror("shmctlshmerror");return-1;printf("shm_segsz=%dbytesn",(int)buf.shm_segsz);printf("parentpid=%d,shm_cpid=%dn",(int)getpid(),(int)buf.shm_cpid);printf("chlidpid=%d,shm_lpid=%dn&
13、quot;,(int)pid,(int)buf.shm_lpid);shmaddr=(char*)shmat(shmid,NULL,0);if(*(int*)shmaddr=-1)perror("shmataddrerror");return-1;printf("%s",shmaddr);shmdt(shmaddr);shmctl(shmid,IPC_RMID,NULL);else(perror("forkerror");shmctl(shmid,IPC_RMID,NULL);)return0;)#include<stdio.h
14、>#include<sys/shm.h>#include<sys/ipc.h>#include<sys/sem.h>#include<string.h>x_o鲜瑞文件时编辑值)查看馆度索搜端仃)ffiao(H)KjoQhoo-Insptron-5547:gccmenory4.ctoohoo-Insplron-5547./a.out;hn_seg$2=1024bytes»arentpid=3233#shmcpid=3233由lidptd=3234,shn_lptd=3234h.,Ianchildprocess!ioohoo-Insp
15、iron-S547:1#include<stdlib.h>#include<unistd.h>#defineMY_SHM_ID34325#defineMY_SEM_ID23234#defineMAX_STRING10typedefstruct(intsemID;intcounter;charstringMAX_STRING+1;MY_BLOCK_T;intmain(intargc,char*argv)(intshmid,ret,i;MY_BLOCK_T*block;structsembufsb;charuser;/makesurethereisacommandif(ar
16、gc>=2)(/createthesharedmemorysegmentandinitit/withthesemaphoreif(!strncmp(argv1,"create",6)(/createthesharedmemorysegmentandsemaphoreprintf("Creatingthesharedmemoryn");shmid=shmget(MY_SHM_ID,sizeof(MY_BLOCK_T),(IPC_CREAT|0666);block=(MY_BLOCK_T*)shmat(shmid,(constvoid*)0,0);bl
17、ock->counter=0;/createthesemaphoreandinitblock->semID=semget(MY_SEM_ID,1,(IPC_CREAT|0666);sb.sem_num=0;sb.sem_op=1;sb.sem_flg=0;semop(block->semID,&sb,1);/nowdetachthesegmentshmdt(void*)block);printf("Createthesharedmemoryandsemaphoresuccessufllyn");elseif(!strncmp(argv1,"
18、;use",3)/*usethesegment*/mustspecifyalsoalettertowritetothebufferif(argc<3)exit(-1);user=(char)argv20;/grabthesegmentshmid=shmget(MY_SHM_ID,0,0);block=(MY_BLOCK_T*)shmat(shmid,(constvoid*)0,0);/*#师点就是使用旗语共享区的访问#*/for(i=0;i<100;+i)sleep(1);/段置成1s就会看到a/b交替出现,为0则a和b连续出现/grabthesemaphoresb.se
19、m_num=0;sb.sem_op=-1;sb.sem_flg=0;if(semop(block->semID,&sb,1)!=-1)/writethelettertothesegmentbuffer/thisisourCRITICALSECTIONblock->stringblock->counter+=user;sb.sem_num=0;sb.sem_op=1;sb.sem_flg=0;if(semop(block->semID,&sb,1)=-1)printf("Failedtoreleasethesemaphoren");el
20、seprintf("Failedtoacquirethesemaphoren");)/dosomeclearworkret=shmdt(void*)block);)elseif(!strncmp(argv1,"read",4)/herewewillreadthebufferinthesharedsegmentshmid=shmget(MY_SHM_ID,0,0);if(shmid!=-1)block=(MY_BLOCK_T*)shmat(shmid,(constvoid*)0,0);block->stringblock->counter+1=
21、0;printf("%sn",block->string);printf("Lengteah=%dn",block->counter);ret=shmdt(void*)block);)elseprintf("Unabletoreadsegmentn");)elseif(!strncmp(argv1,"remove",6)shmid=shmget(MY_SHM_ID,0,0);if(shmid>=0)block=(MY_BLOCK_T*)shmat(shmid,(constvoid*)0,0);/r
22、emovethesemaphoreret=semctl(block->semID,0,IPC_RMID);if(ret=0)printf("Successfullyremovethesemaphoren");/removethesharedsegmentret=shmctl(shmid,IPC_RMID,0);if(ret=0)printf("Successfullyremovethesegmentn");)elseprintf("Unkonwcommandn");)return0;)乂_口罐逑/件旧看建旧£«(V)携新国培靖E的勘同hoohoo-1nsptrcn-5547:gccmemary3-c-ohoo$hDD-Inspiron-554T:B/w3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度盘点协议转换器与供应链管理系统集成合同
- 二零二五年度旧房装修翻新工程安全防护协议
- 二零二五年度美容院转让定金及美容仪器租赁合同
- 二零二五年度茶叶茶馆经营管理合作协议
- 二零二五年度城市综合体工程合同监理方案
- 二零二五婚前财产公证与婚姻财产保全服务协议
- 二零二五年度水果代销售后服务合同
- 车险知识培训课件
- 兽药药品培训知识课件
- 钢筋混泥土知识培训课件
- 患教-颈动脉斑块课件
- 10KV系统短路电流整定计算表格
- 初中英语 沪教牛津版 8B U1-4 More Practice Success for Spring Buds 课件
- 压水堆核电厂在役检查课件
- 前房角镜检查法及其在眼科的应用教学课件
- 2017年度项目生产部工作计划推进表甘特图
- 地下室车库综合管线施工布置
- 采购订单模板
- 巴马格纺丝控制系统软件说明书(共46页)
- 完整解读2021年《建设工程抗震管理条例》PPT教学讲座课件
- 肺结核患者管理ppt课件
评论
0/150
提交评论