




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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将来决定就是创建新得信号量集合,还 就是引用一个现有得信号量集合。nsems就是该
2、集合中得信号量数。如果就是 创建新 集合(一般在服务器中),则必须指定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 semopa r r a
3、 y L size_t nops);se moparray就是一个指针,它指向一个信号量操作数组。n ops规定该 数组中操作得数量.ftok原型如下:k e y_t fto k ( cha r * fname, int id )f n ame就就是指定得文件名(该文件必须就是存在而且可以访问得),id就是子序号,虽然为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、hin 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:无效得参数shma d d n消息队列消息队列就就是一个消息得链表。可以把消息瞧作一个
6、记录,具有特定得格 式以及特定得优先级.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, void * msgp, siz e_ t msg s z , Ion g msg t y p
7、, 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:用来指明核心程序在队列没有数据得情况下所应采取得行动。3、设置消息队列属性原型:i nt m s gctl (in t m s gq
8、 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 DIPC_STAT :该命令用来获取消息队列对应得m s q i d_d s 数据 结构,并将其保存到buf指定得地址空间。IPC_SET :该命令用来设置消息队列得属性,要设置得属性存储在b uf中。IPC_RMID :从内核中删除msqid 标识得消息队列。实验内容:1、完成教材上信号量实例,想一下f to k函数得作用?修改
9、例子,创建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 deffdef i neDELAY JTIME3unio n s emu n、int val;struct semid_ds * b uf;、u n signe d shor t *a r r a y ;in t i n it_sem(int s c md, int init_ value)(union semunsem_union;
10、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 (semd, 0PC_RMID,Sm_un ion) =1)* 、 pe r ror (Delet e semaphore);return -1;打int s em_p (int s
11、 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 & spe r r or ( n P op e ra t io n ”):“return)r e tur n 0 :i nt s em_ v (int s c md)stru c t s em b uf sem b :s em_num = 0 :sem_b、sem_o p = 1 :、sem_b. s em_fl g =S E M_UNDO:i f ( s em o
12、p (sem_id,&sem_b 1 )=1)p e r r or (Vope rati o n ):。retu r n 1 :)4 re t urn 0:int m a in()(沖 i d_ t re s ult:i n t sem_ i d :4 s em_id = s emg e t ( f tok( M/ af ), 1 0 666 I I PC_CREAT);“n i t_ s e m(semd, 0):sprint f(Ch i Id proces s wi 1 I w a i t for some seco n d s、 nu):s leep(DELAY_TIME):# pri
13、ntf (Th e r e turned va 1 ud is %d in t h e chi 1 d proce s s (PID = %d) n result, getpid();osem_v (sc m_id);等待进程:#include# i nc I u d e #in c 1 u d e (stdi o、h# i nc 1 u d e#inelude #inclu devsys/sem、h #include# define D ELAY_T I ME 3u n ion sem u n。i n t val;。struct s e mid_d s *buf:。un s igned s
14、h ort *array;int init_ s em(i n t sem_id, 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 :3retu r n 0 ;int d el_s e m ( i nt s em_ i d) un i o n $ emun $
15、 em_union:if (s e mctl ( s em id, 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&sem_b, 1 ) = = 1) nape rror (P operati
16、on ” );。a ret u r n 1:n r e t urn 0;in t sem_v(int s e m_id)st r uct sem b uf s em_b;。sem_b、sem_num =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, &sem_b, 1 ) = = 1) o p e rror(nV operat i onH);o r eturn3。return 0;i nt m a in() 。pid_t res u It:i n t s e mjd;semjd =semge
17、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 the 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 elud
18、e #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 2048int main () p i d_t pi 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
19、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 or (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 es hm_a ddr);prin t f( C hil
20、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) qprintf (HChi 1 d :Wait fo r e n a ble dat a 八、nH);a os I eep (5):o oq 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_R
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车队质控工作总结
- 社交媒体营销的关键要素
- 2025-2030中国健康保险行业发展分析及竞争格局与发展趋势预测研究报告
- 2025-2030中国保湿润肤露行业发展分析及发展趋势预测与投资风险研究报告
- 2025-2030中国便携式迷你冰箱行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国交通车辆行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国亚麻坯布行业发展分析及发展前景与投资研究报告
- 2025-2030中国乳酸菌制剂行业市场发展分析及竞争格局与投资战略研究报告
- 2025-2030中国书法绘画用品行业市场发展分析及前景趋势与投资研究报告
- 2025-2030中国中医院行业市场深度调研及竞争格局与投资研究报告
- GB/T 3317-2006电力机车通用技术条件
- GB/T 30133-2013卫生巾用面层通用技术规范
- 二年级科学 《磁极与方向》优教
- 沥青路面病害课件
- 安全周知卡-酒精
- 《中学语文课程标准与教材研究》教学大纲
- 我国钢铁企业环境会计信息披露问题研究以宝钢为例13.26
- 测绘工程产品价格-国测财字20023号-测量费
- 罗氏试剂盒说明书 T3 11810456001V18
- 风机盘管机组巡检记录表
- 果汁加工工艺
评论
0/150
提交评论