搜索
您的当前位置:首页正文

操作系统实验四

来源:尚佳旅游分享网
贵州大学实验报告

学院: 计算机科学与技术 专业: 信息安全 班级:121

姓名 实验时间 饶永明 11.11 学号 指导教师 1208060066 王道书 实验组 成绩 实验项目名称 实验四 进程的管道通信 实验目的 实验要求 在ubuntu下编写、运行程序并对结果进行分析、总结。 1、了解什么是管道 2、熟悉UNIX/LINUX支持的管道通信方式 实验内容 编写程序实现进程的管道通信。用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。 试验程序: #include #include #include int pid1,pid2; main( ) { int fd[2]; char outpipe[100],inpipe[100]; pipe(fd); /*创建一个管道*/ while ((pid1=fork( ))= =-1); if(pid1= =0) { lockf(fd[1],1,0); //加锁锁定写入端 sprintf(outpipe,\"child 1 process is sending message!\"); /*把串放入数组outpipe中*/ write(fd[1],outpipe,50); /*向管道写长为50字节的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); //释放管道写入端 exit(0); } else //············(1) { 实while((pid2=fork( ))= =-1); if(pid2= =0) //··············(2) 验{ lockf(fd[1],1,0); /*互斥*/ sprintf(outpipe,\"child 2 process is sending message!\"); 数 write(fd[1],outpipe,50); 据 sleep(5); lockf(fd[1],0,0); exit(0); } Else //················(3) { wait(0); /*同步*/ read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/ printf(\"%s\\n\ wait(0); read(fd[0],inpipe,50); printf(\"%s\\n\ exit(0); } } } 程序运行结果: 实验分析: 根据对程序进行gdb调试,可知道程序流程大致如下: 首先先创建了一个管道,接着用fork()创建一个与父进程并行的子进程,由程序运行结果图可知:结果一是父进程先运行,子进程后运行;而结果二相反。我以结果一为例: 第一层父进程:接下来父进程开始执行标号为(1)的else{}语句,接下来父进程又创建了一个并行的第二层子进程和父进程,接着第二层父进程进入标号为(3)的else{}语句后遇到wait(0)后停止运行等待子进程执行,第二层子进程进入标号为(2)的if{}语句:锁定管道并向管道中写入\"child 2 process is sending message!\"字符串,接着等待5秒让第二层父进程执行,第二层父进程从管道中读取字符串并输出,所以在终端等了5秒后输出了结果一的第一句字符串,接着再返回第二层子进程,第二层子进程解锁管道并退出。 第一层子进程:第一层子进程进入if(pid2= =0){}语句,锁定管道并向管道中输入字符串\"child 1 process is sending message!\",接着等待5秒让第一层父进程从管道中读取字符串并输出,所以在终端中等了第二个五秒后输出了结果一的第二句字符串,接着再返回第一层子进程,第一层子进程解锁管道并退出。 实验总结 此次实验让我知道了管道的运行机制,管道是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接收管道输出的接受进程(即读进程),则从管道中接收数据。 当然,也让我对fork()的运用有了更深入地了解。 思考题 1、程序中的sleep(5)起什么作用? 答:让子进程沉睡5s,使父进程执行 2、子进程1和2为什么也能对管道进行操作? 答:利用pipe( )建立起来的无名文件(无路径名)。只用该系统调用所返回的文件描述符来标识该文件,故只有调用pipe()的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进行通信。当这些进程不再使用此管道时,核心收回其索引结点。因为父进程用pipe()创建了一个无名管道,子进程1和2都知道该管道文件描述符,所以进程1和2都能对管道进行操作。 指导教师意见 签名: 年 月 日 注:各学院可根据教学需要对以上栏木进行增减。表格内容可根据内容扩充。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top