第4次小课进程间通信(上)_第1页
第4次小课进程间通信(上)_第2页
第4次小课进程间通信(上)_第3页
第4次小课进程间通信(上)_第4页
第4次小课进程间通信(上)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

第四次小课进程间通信(上)华软软件工程系进程间通信实验课主要内容本周大课内容回顾通过实验理解软中断信号机制以及如何通过软中断实现父子进程同步通过实验理解无名管道通信主要内容第一部分本周大课内容回顾软中断管道通信主要内容大课内容回顾(1)进程间通信根据信息量不同能划分成哪两种类型?两种类型有何区别?进程控制(控制信息的通信,低级通信)数据交换(大批数据的通信,高级通信)OS为进程间通信提供的常用接口有哪些?Linux支持哪些机制?接口软中断信号、信号量集管道、消息队列、共享内存等Linux支持的有:软中断信号、管道、IPC(信号量、消息缓冲、共享内存)大课内容回顾(2)软中断信号主要用于解决何种问题?如何使用软中断信号?管道的定义?无名管道的工作原理是?无名管道能否进行双向通信?无名管道能否在任意进程间通信?Linux软中断信号的系统调用(1)软中断信号的预置函数signal()调用格式:signal(sig,function)说明:sig软中断信号的序号或名称function与软中断信号关联的函数名Linux软中断信号的系统调用(2)发送软中断信号函数kill()调用格式:kill(pid,sig)说明:pid表示一个或一组进程标示符,pid值的定义如下:

>0:将信号发送给指定的进程

=0:将信号发送给同组的所有进程=-1:将信号发送给所有满足如下条件的进程:进程的用户标示符等于发送信号进程的有效用户标示符Sig为软中断信号(序号或名称)Linux管道通信(1)无名管道的创建系统调用:intpipe(intPipeName[2]);参数说明:PipeName[2],管道名,为一2元整型数组PipeName[0]专用于读进程PipeName[1]专用于写进程返回值:整型。0代表管道创建正确;-1代表管道创建失败。该管道由创建进程及其子孙进程共享使用头文件:unistd.hLinux管道通信(2)无名管道的读写系统调用写:write(PipeName[1],buf,size);读:read(PipeName[0],buf,size);参数说明:PipeName,管道名。其中[0]专用于管道的读操作,[1]专用于管道的写操作buf,存放读或者写数据的缓冲区size,读或者写数据的长度(字节数)第二部分进程间通信实验软中断管道通信主要内容实验1软中断实验4-1.c:编写一个程序,循环显示字符串”Hello!”,当键盘键入ctrl+c时终止循环,并显示“OK!”后结束。代码及结果如图所示改造:要求按3次Ctrl+C后才结束将signal()语句和函数删除后重新编译看结果有何变化?实验1软中断实验(4-1.c)#include<stdio.h>#include<stdlib.h>#include<signal.h>//voidint_func(intsig);intk;voidint_func(intsig){ k=0; printf("int_func\n");}main(){ signal(SIGINT,int_func); k=1; while(k==1) { printf("Hello!\n"); } printf("OK!\n"); exit(0);}实验2使用软中断实现父子进程同步假设父进程先执行,父进程显示3行字符串;父进程向子进程发送软中断信号,等待子进程终止后,父进程输出结束信息”OK!”,然后终止执行。子进程循环显示”Iamachild!”,接收到父进程发来的软信号后停止循环,显示”childexited!”并终止执行。分析:父子父同步结果如图所示(子进程先执行的结果)改写如果把kill()函数注释掉,结果将如何?为什么?分别注释掉代码中的信号函数会有怎样的结果,为什么?把第一个sleep(1)改成sleep(10)又会有什么样的结果,为什么?如果一定要子进程先执行,如何改写?4-2.c#include<stdio.h>#include<stdlib.h>#include<signal.h>intk1;voidint_fun1(){ k1=0;}main(){ intk,p1; while((p1=fork())==-1); if(p1>0) { for(k=1;k<4;k++) { printf("Howareyou!\n"); sleep(1);//延时函数sleep(),延时1秒

} kill(p1,12); wait(0); printf("OK!\n"); exit(0); } else { signal(12,int_fun1); k1=1; while(k1==1) { printf("Iamchild\n"); sleep(1); } printf("Childexited!\n"); exit(0); }}实验3无名管道应用文件名4-4.c:父进程创建一个子进程和一个无名管道fd,由子进程向管道写入信息”Thisisamessage!”,然后终止执行;父进程接收到子进程终止信号后从管道中读出并显示信息后结束。注意:管道的创建、管道数据的读写改造:父进程创建两个子进程P1、P2,P1向管道的写数据“PipeMessageTest”,P2从管道读数据并显示这些数据。思考:类似这种父子进程之间的数据通信还有什么解决方案?4-4.c#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>main(){ intp1,fd[2]; charoutpipe[50];//定义读缓冲区

//charinpipe[50]="Thisisamessage!";//定义写缓冲区

charinpipe[50]; pipe(fd);//创建无名管道fd while((p1=fork())==-1); if(p1==0)//子进程返回

{ strcpy(inpipe,"Thisisamessage!"); write(fd[1],inpipe,50) ;//写信息到管道

exit(0); } else//父进程返回

{ wait(0);//

温馨提示

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

评论

0/150

提交评论