实验八 进程通信——管道

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浙江大学城市学院实验报告

课程名称操作系统原理实验

实验项目名称实验八进程通信——管道

学生姓名专业班级学号

实验成绩指导老师(签名)日期

注意:

●务请保存好各自的源代码,已备后用。

●完成本实验后,将实验报告上传ftp。如没有个人文件夹,请按学号_姓名格式建立。

●文件名为:学号_姓名_实验XX,如30801001_XXXX_实验01

一. 实验目的和要求

1.了解Linux系统的进程间通信机构(IPC);

2.理解Linux关于管道的概念;

3.掌握Linux支持管道的系统调用和管道的使用;

4.巩固进程同步概念。

二、实验内容

用系统调用pipe( )创建管道,实现父子进程间的通信。

三、实验步骤

1、并发进程的无管道通信

1)编译运行给出的pipe1.c,观察运行结果。

2)思考:观察程序运行结果,比较新旧文件的内容是否有差异,并分析原因。

有差异,把1中的数字逐个读入到2中但是顺序会改变。

2、多进程的管道通信,编译并运行给出的代码pipe3.c,观察并理解多进程通过管道通信。

3、编写程序:(来自第三章习题)假定系统有三个并发进程read,move和print共享缓冲器B1和B2。进程read负责从输入设备上读信息,每读出一个记录后把它存放到缓冲器B1中。进程move从缓冲器B1中取出一个记录,加工后存入缓冲器B2。进程print将B2中的记录取出打印输出。缓冲器B1和B2每次只能存放一个记录。要求三个进程协调完成任务,使打印出来的与读入的记录的个数,次序完全一样。试创建三个进程,用pipe( )打开两个管道,如错误!未找到引用源。所示,实现三个进程之间的同步。

程序源码:

#include

#include

#include

int pid1,pid2;

main( )

{

int fd1[2];

int fd2[2];

char outpipe[100],inpipe[100];

pipe(fd1);

pipe(fd2); /*创建两个管道*/

while ((pid1=fork( )) == -1);

if(pid1 == 0)

{ while ((pid2=fork( )) == -1);

if(pid2==0){

lockf(fd1[1],1,0);

/*把输出串放入数组outpipe中*/

sprintf(outpipe,"copy that!");

write(fd1[1],outpipe,50); /*向管道写长为50字节的串*/

sleep(3); /*自我阻塞3秒*/

lockf(fd1[1],0,0);

return 0;

}

else

{

wait(0); /*同步*/

read(fd1[0],inpipe,50); /*从管道中读长为50字节的串*/

printf("son:%s\n",inpipe);

lockf(fd2[1],1,0); /*互斥*/

write(fd2[1],inpipe,50);

sleep(1);

lockf(fd2[1],0,0);

return 0;

}

}

else

{

wait(0); /*同步*/

read(fd2[0],outpipe,50); /*从管道中读长为50字节的串*/

printf("father:%s\n",outpipe);

return 0;

}

}

程序运行结果:

程序分析:

先fork一个子进程然后在子进程里面在fork出一个孙子进程,孙子进程向管道fd1写入copy that。然后通过管道子进程得到消息,然后再写入管道fd2,由管道fd2传送消息给父进程。

四、讨论、心得

记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。

相关文档
最新文档