资源描述:
《山东大学操作系统试验-2》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、软件学院实验报告实验题目:线程和进/线程管道通信实验学号:20100030xxxx日期:2012-4-26班级:五班姓名:Email:实验目的:通过Linux系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进/线程间的通信和协作的效果,练习利用无名管道进行进/线程间通信的编程和调试技术。硬件环境:IBM实验室计算机软件环境:eclipsegcc编译器Ubuntu-Linux操作系统Gnome桌面实验步骤:1.认真阅读试验指导书所给出的相关知识与示例程序,在此基础上分析独立试验要求,然后着手开始编写程序。2
2、.用eclipse新建一个cproject。3.新建sourcefolder4.新建名为ppipe.c的C语言程序5.再建立以下名为ppipe.h的C语言头文件6.build项目,产生可运行的二进制文件。7.对程序进行调试,排除bug。8.进入终端,运行程序,结果如下图所示:源代码:/**Filename:ppipe.c*copyright:(C)2006byzhanghonglie*Function:利用管道实现在父子进程间的消息通信*/#include"ppipe.h"intmain(intargc,char*argv[]){intpi
3、d1;//子进程1intpid2;//子进程2intpipe1[2];//存放第一个无名管道标号intpipe2[2];//存放第二个无名管道标号intx,y;//两个输入变量//使用pipe()系统调用建立两个无名管道。建立不成功程序退出,执行终止if(pipe(pipe1)<0){perror("pipenotcreate");exit(EXIT_FAILURE);}if(pipe(pipe2)<0){perror("pipenotcreate");exit(EXIT_FAILURE);}//使用fork()系统调用建立子进程,建立不成
4、功程序退出,执行终止if((pid1=fork())<0){perror("processnotcreate");exit(EXIT_FAILURE);}elseif(pid1==0){printf("输入x:");scanf("%d",&x);//读入xintansX=1;if(x==1){//写入管道1的1端write(pipe1[1],&x,sizeof(int));}elseif(x>1){inti=2;for(;i<=x;i++){ansX=ansX*i;}x=ansX;write(pipe1[1],&x,sizeof(int))
5、;}printf("child1f(x)=%d",x);//完成计算之后,完成写之后,关闭管道close(pipe1[1]);//子进程1执行结束exit(EXIT_SUCCESS);}//子进程号大于0表示父进程在执行,else{if((pid2=fork())<0){perror("processnotcreate");exit(EXIT_FAILURE);}elseif(pid2==0){signal(SIGCONT,handler);//子进程二先等待,待子进程1执行完毕之后由父进程唤醒pause();printf("输入y:"
6、);scanf("%d",&y);//读入yintansY1=1;intansY2=1;if(y==1
7、
8、y==2){y=1;//写入管道2的1端write(pipe2[1],&y,sizeof(int));}elseif(y>2){inti=0;for(;i9、",y);//完成计算之后,完成写之后,关闭管道close(pipe2[1]);//子进程1执行结束exit(EXIT_SUCCESS);}//计算f(x,y)//先等待子进程1执行完毕,在唤醒子进程二waitpid(pid1,NULL,0);kill(pid2,SIGCONT);read(pipe1[0],&x,sizeof(int));read(pipe2[0],&y,sizeof(int));close(pipe1[0]);close(pipe2[0]);printf("parentf(x,y)%d",x+y);}//父进程执
10、行结束returnEXIT_SUCCESS;}/**Filename:ppipe.c*copyright:(C)2006byzhanghonglie*Function:利用管道实