Linu进程间通信试验报告_第1页
Linu进程间通信试验报告_第2页
Linu进程间通信试验报告_第3页
Linu进程间通信试验报告_第4页
Linu进程间通信试验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、实验六:Linux进程间通信(2)(4课时) 实验目得: 理解进程通信原理;掌握进程中信号量、共享内存、消息队列相关得函数得使用. 实验原理: Linux下进程通信相关函数除上次实验所用得儿个还有: 信号量 A信号量乂称为信号灯,它就是用来协调不同进程间得数据对象得,而最主要 得应用就是前一节得共享内存方式得进程间通信。要调用得第一个函数就是 semget,用以获得一个信号量ID。 int s emg e t( k ey_t key, int nsems, i nt fla g ); key就是I PC结构得关键字,flag将来决定就是创建新得信号量集合,还 就是引用一个现有得信号量集合。ns

2、ems就是该集合中得信号量数。如果就是 创建新 集合(一般在服务器中),则必须指定nsems:如果就是引用一个现 有得信号量集合(一般在客户机中)则将nsems指定为0。 se mctl函数用来对信号量进行操作. in t s e mctl( in tsemid , in t sem n um, in t cm d , union semun arg); 不同得操作就是通过cmd参数来实现得,在头文件sem. h中定义了 7种 不同得操作,实际编程时可以参照使用. semop函数自动执行信号量集合上得操作数组。 int semop(int semid, struct s e m b u f s

3、emopa r r a y L size_t nops); se moparray就是一个指针,它指向一个信号量操作数组。n ops规定该 数组中操作得数量. ftok原型如下: k e y_t fto k ( cha r * fname, int id ) f n ame就就是指定得文件名(该文件必须就是存在而且可以访问得),i d就是子序号,虽然为int,但就是只有8个比特被使用(0-25 5 )o 当成功执行得时候,一个key_t值将会被返回,否则一1被返回。 共享内存 共享内存就是运行在同一台机器上得进程间通信最快得方式,因为数据不需 要在不同得进程间复制通常山一个进程创建一块共享内存

4、区,其余进程对这块 内存区进行读写首先要用得函数就是s hmge t ,它获得一个共享存储标识符. # i n c 1 u d e # in c lude h #in c lude sys/shm、h in t s h m g et (key_t key. int si z e , i nt flag); 当共享内存创建后,其余进程可以调用shmat()将其连接到自身得地址空 间中。 void * shm a t ( i nt shmid, void 火add门 int flag); s hmid为s hmg e t函数返回得共享存储标识符,add r与fl a g参数决定 7以什么方式来确定

5、连接得地址,函数得返回值即就是该进程数据段所连接得实 际地址,进程可以对此进程进行读写操作。 断开共享内存连接: 与shma t函数相反,shmd t就是用来断开与共享内存附加点得地址, 禁止本进程访问此片共享内存 函数原型 int shm d t (const void *shmad d r) 函数传入值 shmadd r:连接得共享内存得起始地址 函数返回值 成功:0 出错:-1,错误原因存于error中 附加说明 本函数调用并不删除所指定得共享内存区,而只就是将先前用shm at函数 连接(attach)好得共享内存脱离(deta ch)目前得进程 错误代码 E I NVAL:无效得参数

6、shma d d n 消息队列 消息队列就就是一个消息得链表。可以把消息瞧作一个记录,具有特定得格 式以及特定得优先级. 1、创建新消息队列或取得已存在消息队列 原型:in t msgget(key_t key, i nt m s gflg); 参数: key:键值,可以指定,也可以由函数ftok生成。 msgf lg:IPC_CREAT值,若没有该队列,则创建一个并返回新标识符; 若已存在,则返回原标识符。 IPC_EXCL值,若没有该队列,则返回若已存在,则返回0。 2、向队列读/写消点 原型: msg rev从队列中取用消息: ssi z e t m s g r cv(int msqid

7、, void * msgp, siz e_ t msg s z , Ion g msg t y p , int m s gflg); msgs n d将数据放到消息队列中: int ms g s n d (i nt m s qid, const void s g p , size_t msgs z , i nt msgf 1 g); 参数: msq i d:消息队列得标识码 msgp:指向消息缓冲区得指针,此位置用来暂时存储发送与接收得消 m s gsz:消息得大小。 msgtyp:从消息队列内读取得消息形态如果值为零,则表示消息队列中 得所有消息都会被读取. m sgflg:用来指明核心程序

8、在队列没有数据得情况下所应采取得行动。 3、设置消息队列属性 原型:i nt m s gctl (in t m s gq i dz i nt c m d , struct msqid_ d s * bu f ); 参数:msgctl系统调用对msgq i d标识得消息队列执行c md操作,系 统定义了 3 种 c m d 操作:IPC_STAT , IPC_SET , IPC RM I D IPC_STAT :该命令用来获取消息队列对应得m s q i d_d s 数据 结构,并将其保存到buf指定得地址空间。 IPC_SET :该命令用来设置消息队列得属性,要设置得属性存储在b uf中。 I

9、PC_RMID :从内核中删除msqid 标识得消息队列。 实验内容: 1、完成教材上信号量实例,想一下f to k函数得作用?修改例子,创建2个进 程完成原来父子进程对应得操作. 子进程代码: #i n c 1 u d e #includeVuni s td、h #inc 1 ude s t d io. h) # i n c lude # inclu d c # i nclude # i n c I u de ffdef i neDELAY JTIME3 unio n s emu n 、int val; struct semid_ds * b uf; 、u n signe d shor t

10、*a r r a y ; ; in t i n it_sem(int s c md, int init_ value) ( union semunsem_union; s c munionx val = i n i t_value: i f (s c me t l(sem_ i d , 0, SETVAL,sc m_union) =1) 、 P error (I n itiali z e semap h ore11); ) 心 t urn 0: i nt d e I_s e m(int semd ) ( 、u nio n s emu n s c m_u n ion: “f (s c met I

11、 (semd, 0PC_RMID,Sm_un ion) =1) * 、 pe r ror (Delet e semaphore); return -1; 打 int s em_p (int s emd) str u c t sembuf sem_b: sem b、sem_num =0 ; 、s cm_b、s em_op =1; sem_ b、s em_f 1 g =SEM_UNDO: 、if(s e mop(s e m_id 。struct s e mid_d s *buf: 。un s igned s h ort *array; ; int init_ s em(i n t sem_id,

12、i n t ini I _val u e) u n i on s e mun s em_uni o n; 。sem_u n ion、v a I = i n i t _value; if (s e me 11( s e md, 0, SETVAL,sem_u n io n ) = = 1 ) o P error(HI n i tialize sem a phore M ; 。 return 1 : 3 retu r n 0 ; int d el_s e m ( i nt s em_ i d) un i o n $ emun $ em_union: if (s e mctl ( s em id,

13、0 , IPC RMID, s em un i on) =-!.) o p e r r or ( H Dele t e semap h ore ” ): re l u r n 1; int s em_p (in t semjd) 。struct sem b uf sem_b: sem_b、s em_n um =0 : sem_b、s e m_op =- 1 : s e m_bx sem_flg=SEM_UNDO: i f (semop (s e m_ i dz in t sem_v(int s e m_id) st r uct sem b uf s em_b; 。sem_b、sem_num =

14、0 : 。s e m_b、sem_o p = 1 : sem_b、sem_f 1 g= S EM_U NDO: 。i f ( s emop(sem_id, o r eturn 3 。return 0; i nt m a in() 。pid_t res u It: i n t s e mjd; semjd =semge I (f t ok(z J 3), 1, 0666 I IPC_CREAT); i n i t_s e m ( s e m_id,0); 。s e m_ p ( s em_ i d ); pri n tf(nTh e ret u r n ed value i s %d in th

15、e father p r oc e s s ( P ID =%d) nt resultzgetpid (); 。 s e m_v (sem J d ): 。 de 1 _s e m(sem_id); 2、完成教材上共孕内存实例,查瞧运行情况。然后修改ftok函数得参数,并编 写两个进程完成实例原来得工作. 代码: # i n elude #inc 1 ude #include #in c lu d e std i o、h # i n c lude #in c lude string、h # d e f ine BU F FE RESIZE 2048 int main () p i d_t pi

16、 d : i n t shmi d : a c har *shm_addr; ocha r f 1 ag= u WROTE ” : q char buffB UFFE R_SIZE oif( s hmid =shmg e t (IPC_PRI VAT 巳 BUFFER_SIZE, 06 6 6) ( 0) perrorCshm g et); exi t (1): else p ri n tf (MCre ate share d -memory: %d n: s h m i d); a sy s tem(i pcs; pi d = fork (); i f(p i d =1) a per r o

17、r (f o rkH); nex i t ( 1 ); o e 1 se i f (pid = 0) a i f(shm_addr = shma t (shmid.O, 0)= (void*)-l) a o pe r r o r(z/ Child: s hmat); e x it ( 1 ): e I s e s hm_a ddr); prin t f( C hil d : Att a ch s h are d m emo r y: %p n ” sys t em(Hipcs o w h i 1 e ( s trncmp (shm_a dd r, f I a g,s t rlen (flag)

18、 qprintf (HChi 1 d :Wait fo r e n a ble dat a 八、nH); a os I eep (5): o o q s t rep y(bufts h m_ad d r+s t r len(flag): “ p r intf(Chi 1 : S h a re d memor y :%sn b u ff) 。 if (shmd t (shm_add r )0) a operror ( M s h mdt); a ex i t (1); o e Is e printf (/ZC h ild: De a t tach s h are d memo r yn ”); 。 a s ystem(Hip c s m):。 “if (shmctl ( s hmi d , I P C_RMID,NULL) =-l) “perror(”Child : shmctl ( I PC_RM I D)nH): exit (1); 。 els e 。pr i nt f (nDe 1 et e s h a redm emo rynH); sy s t e m Cipc

温馨提示

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

评论

0/150

提交评论