您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统实验四报告-进程的管道通信
实验四进程的管道通信一、实验目的(1)加深对进程概念的理解,明确进程和程序的区别。(2)学习进程创建的过程,进一步认识进程并发执行的实质。(3)分析进程争用资源的现象,学习解决进程互斥的方法。(4)学习解决进程同步的方法。(5)掌握Linux系统中进程间通过管道通信的具体实现。二、实验内容使用系统调用pipe()建立一条管道,系统调用fork()分别创建两个子进程,它们分别向管道写一句话,如:Childprocess1issendingamessage!Childprocess2issendingamessage!父进程分别从管道读出来自两个子进程的信息,显示在屏幕上。三、实验要求(1)这是一个设计型实验,要求自行、独立编制程序。(2)两个子进程要并发执行。(3)实现管道的互斥使用。当一个子进程正在对管道进行写操作时,另一个欲写入管道的子进程必须等待。使用系统调用lockf(fd[1],1,0)实现对管道的加锁操作,用lockf(fd[1],0,0)解除对管道的锁定。(4)实现父子进程的同步,当父进程试图从一空管道中读取数据时,便进入等待状态,直到子进程将数据写入管道返回后,才将其唤醒。四、程序流程图(1)程序流程父进程:创建管道;创建子进程1;创建子进程2;等待从管道中先后读出两个子进程写入的信息,并显示在屏幕上;退出。子进程:将管道的写入口加锁;将信息“Childprocessnissendingmessage!”输入到变量OutPipe中,n=1,2;将OutPipe中信息写入管道;使自己进入睡眠状态,另一进程执行;从睡眠状态返回,将管道的写入口解锁;退出。(2)程序流程图五、程序源代码#includestdio.h#includestdlib.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeerror.h#includewait.h#includeunistd.hintmain(){intfd[2],P1,P2;charOutput[50],Input[50];pipe(fd);while((P1=fork())==-1);if(P1==0){lockf(fd[1],1,0);sprintf(Output,ChildprocessP1issendingmessage!);write(fd[1],Output,50);sleep(2);lockf(fd[1],0,0);exit(0);}else{while((P2=fork())==-1);if(P2==0){lockf(fd[1],1,0);sprintf(Output,ChildprocessP2issendingmessage!);write(fd[1],Output,50);sleep(1);lockf(fd[1],0,0);exit(0);}wait(0);read(fd[0],Input,50);printf(%s\n,Input);wait(0);read(fd[0],Input,50);printf(%s\n,Input);exit(0);}return0;}六、运行结果七、问题解答(1)指出父进程与两个子进程并发执行的顺序,并说明原因。父进程创建子进程1并执行,然后父进程创建子进程2并执行,最后父进程执行,程序结束。这是由进程的同步机制决定的,只有子进程向管道中写入信息后,父进程才能读取。(2)若不对管道加以互斥控制,会有什么后果?若不对管道加以互斥控制,可能会使一个子进程写入的信息还没来得及被父进程读出,另一个子进程又写入信息而将之前的信息将覆盖,使信息丢失。(3)说明你是如何实现父子进程之间的同步的。子进程之间通过对管道的加锁与解锁实现子进程的互斥,父子进程间通过使子进程睡眠若干时间等待父进程执行实现父子进程的同步。
本文标题:操作系统实验四报告-进程的管道通信
链接地址:https://www.777doc.com/doc-4603283 .html