文档详情

管道通信实验报告

ba****u6
实名认证
店铺
DOCX
8.82KB
约3页
文档ID:197941355
管道通信实验报告_第1页
1/3

一、 实验目的了解什么是管道,掌握Linux系统中管道通信的原理,了解管道通信的特点 掌握Linux管道的相关函数,了解Linux管道的建立与使用学习利用管道实现 进程间通信二、 实验仪器或设备每人一台计算机,硬件要求:CPUPII以上,64M内存,1OOM硬盘空间即可;软 件要求:Linux操作系统三、 总体设计(设计原理、设计方案及流程等)创建两个进程:进程1和进程2,利用进程1和进程2分别向管道中写内容, 然后创建父进程,读取管道中的内容,从而实现管道进的通信,并通过读写的信 息,查看管道间通信的情况此外,进程1和进程2是并行执行的,但是在每次 写入数据后,要使其休眠一段时间编写程序实现进程的管道通信用系统调用pipe()建立一管道,二个子进 程 pid1 和 pid2 分别向管道各写一句话:Child process 1 is sending a message! Child process 2 is sending a message!父进程从管道中读出二个来自子进程 的信息并显示四、 实验步骤(包括主要步骤、代码分析等)主要步骤:1、 创建子进程1,向管道中写入信息;2、 创建子进程2,向管道中写入信息,3、 父进程读取管道内的信息。

程序代码:#include #include int pid1, pid2;int main()(int fd[2];char 0utPipe[100],InPipe[100];pipe(fd);while((pid1 = fork()) == -1); 〃创建子进程 1if(pid1 == 0)(printf("\nChild1\n");lockf(fd[1], 1, 0);sprintf(OutPipe, "\n Child process 1 is sending message!\n〃); write(fd[1], OutPipe, 50); 〃向管道中写内容sleep(5);lockf(fd[1], 0, 0);exit(0);}else(while((pid2 = fork()) == -1); //创建子进程 2if(pid2 == 0)(printf(〃\nChild2\n〃); lockf(fd[1], 1, 0);sprintf(OutPipe, "\n Child process 2 is sending message!\n〃);write(fd[1], OutPipe, 50); 〃向管道中写内容 sleep(5);lockf(fd[1], 0, 0);exit(0);}else(printf("\nFather1\n");wait(0);read(fd[0], InPipe, 50);printf("%s\n", InPipe);printf("\nFather2\n");wait(0);read(fd[0], InPipe, 50);printf("%s\n", InPipe);exit(0);}}return 0;}五、结果分析与总结实验结果:Child1Child process 1 is sending message!SdskffjgjFather1SdskffjgjChild2Child process 2 is sending message!DfdakjFather2Dfdakjjgj结果分析:父进程在读取子进程向管道里面入写的数据时,子进程1原内容输出,但是 当子进程2写过后有覆盖现象。

而且由于子进程父进程每执行一次相关操作后, 就会休眠,使得运行结果不唯一覆盖现象是因为子进程创建后,虽然是共享父进程中管道的空间,但并不是 说有指针等指向那里,而是将该地址空间的内容,复制到自己的那部分空间中, 而程序总子进程每次是从头开始填写,所以有覆盖现象如果设置全局变量,指 向读写后的当前位置为下一次读写的其实位置,可以调试出不同的结果总结:通过本次试验,我掌握了 Linux系统中管道通信的原理,了解了管道通信的特 点,掌握了 Linux管道的相关函数的功能及使用方法,并了解了 Linux管道的建 立与使用,学会了如何利用管道实现进程间的通信,对进程间的通信有了更深刻 的理解与掌握。

下载提示
相关文档
正为您匹配相似的精品文档