实验八 进程通信——管道
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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传送消息给父进程。
四、讨论、心得
记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。