版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验题目进程的管道及消息通信小组合作否姓名班级学号一、实验目的1、了解什么是管道2、熟悉LINUX支持的管道通信方式3、了解Linux系统中的进程间通信机制,包括共享内存和信号量。二.实验环境安装了Linux虚拟机的Windows系统的计算机一台三、实验内容与步骤一、管道通信1、创建无名管道的格式#include<sys/types.h>#include<ctype.h>#include<unistd.h>intpipe(intfiledes[2]);真确返回:0,错误返回:-1。无名管道pipe()的使用例子:使用无名管道pipe(),进行父子进程之间的通信。源代码如下:#include<sys/types.h>#include<ctype.h>#include<unistd.h>intpipe(intfiledes[2]);charparent[]="Amessagetopipe'communication.\n";main(){intpid,chan1[2];charbuf[100];pipe(chan1);pid=fork();if(pid<0){printf("tocreatechilderror\n");exit(1);}if(pid>0){close(chan1[0]);printf("parentprocesssendsamessagetochild.\n");write(chan1[1],parent,sizeof(parent));close(chan1[1]);printf("parentprocesswaitsthechildtoterminate\n");wait(0);printf("parentprocessterminate\n");}else{close(chan1[1]);read(chan1[0],buf,100);printf("Themessagereadbychildprocessfromparentis:%s.\n",buf);close(chan1[0]);printf("childprocessterminates\n");}}运行结果:2、打开一个以命令行为参数的管理文件,完成进程之间的通信进程例子:以命令行为参数的管理文件的示例。假设有一个的可执行程序chcase,从标准输出设备读字符,将小写字母转换成大写字母并进行输出。主程序使用popen创建管道,实现将某文件中的字母转换成大写字母。其中的文本文件名作为参数传进来。源程序如下:#include<sys/wait.h>#include<stdio.h>#defineMAXLINE100intmain(intargc,char*argv[]){charline[MAXLINE];FILE*fpin,*fpout;if(argc!=2){fprintf(stderr,"usage:a.out<pathname>\n");exit(1);}if((fpin=fopen(argv[1],"r"))==NULL){fprintf(stderr,"can'topen%s\n",argv[1]);exit(1);}if((fpout=popen("/mnt/usb/mldm/chcase.exe","w"))==NULL){fprintf(stderr,"popenerror\n");exit(1);}while((fgets(line,MAXLINE,fpin))!=NULL){if(fputs(line,fpout)==EOF) {fprintf(stderr,"fputserrortopipe.\n");exit(1); }}if(ferror(fpin)){fprintf(stderr,"fgetserror.\n");exit(1);}if(pclose(fpout)==-1){fprintf(stderr,"pcloseerror.\n");exit(1);}exit(0);}运行结果:3、有名管道的通信有名管道使用的例子;代码如下:#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>#include<fcntl.h>intmknod(constchar*pathname,mode_tmode,dev_tdev);charstring[]="thisisaexampletoshowfifocommunication";main(argc,argv)intargc;char*argv[];{intfd;charbuf[256];inti;mknod("fifo",010777,0);if(argc==2){fd=open("fifo",O_WRONLY);}else{fd=open("fifo",O_RDONLY);}for(i=0;i<26;i++){if(argc==2) {printf("\nIhavewrote:%s",string);write(fd,string,45);string[0]+=1; }else {read(fd,buf,256);printf("\nThecontextbyIhavereadis:!%s",buf);buf[0]='\0'; }}close(fd);}运行结果:二.消息缓冲机制客户进程收到服务结果信息后,显示两者的通信过程,下面给出客户进程和服务者进程通信示例的源程序:客户进程的通信过程#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#defineSVKEY75#defineREQ1structmsgform{ longmtype;//消息类型 charmtext[256];//消息正文 }main(){ structmsgformmsg; intmsqid,pid,*pint; msqid=msgget(SVKEY,0777);//创建消息队列 pid=getpid();//获得当前进程标识 pint=(int*)msg.mtext;//获得消息正文首地址 *pint=pid;//将客户进程的pid复制到消息缓冲区中 msg.mtype=REQ; msgsnd(msqid,&msg,sizeof(int),0);//发送消息 msgrcv(msqid,&msg,256,pid,0);//这里pid作为消息类型 printf("clientreceiveserver'sserviceresultisserver'spid:%d\n",pid) ;}服务进程server.c代码如下所示:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#defineSVKEY75#defineREQ1structmsgform{ longmtype; charmtext[256];}main(){ intmsqid; structmsgformmsg; inti,pid,*pint; msqid=msgget(SVKEY,0777|IPC_CREAT);//创建消息队列 for(;;) { msgrcv(msqid,&msg,256,REQ,0);//接受客户发送的消息 printf("serverisdoingtheserviceforaclient.\n"); pint=(int*)msg.mtext; pid=*pint;//获得客户pid,以便进行服务 printf("serverreceiveclient'sservicerequestisclient'spid:'%d'.\n",pid); msg.mtype=pid; pid=getpid();/*经服务进程的的pid发送给客户 msgsnd(msqid,&msg,sizeof(int),0); }}运行结果:四、实验过程与分析在1例子中:1、pipe()是建立一无名管道,系统调用格式为pipe(filedes)参数定义是intpipe(filedes);intfiledes[2];其中,filedes[1]是写入端,filedes[0]是读出端。2、read()的系统调用格式是read(fd,buf,nbyte),参数定义是intread(fd,buf,nbyte);intfd;char*buf;unsignednbyte;它的功能是从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。3、write()系统调用格式是read(fd,buf,nbyte),它的功能是把nbyte个字节的数据,参数定义同read(),而父进程则从管道中读出来自两个进程的信息,显示在屏幕上。从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。五、实验总结一、什么是管道:所谓管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。二、管道的类型:1、有名管道:一个可以在文件系统中长期存在的、具有路径名的文件。用系统调用mknod()建立。它克服无名管道使用上的局限性,可让更多的进程也能利用管道进行通信。因而其它进程可以知道它的存在,并能利用路径名来访问该文件。对有名管道的访问方式与访问其他文件一样,需先用open()打开。2、无名管道:一个临时文件。利用pipe()建立起来的无名文件(无路径名)。只用该系统调用所返回的文件描述符来标识该文件,故只有调用pipe()的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 鸡肉炒肉课程设计
- 年度固定照明设备市场分析及竞争策略分析报告
- 铁路轨道工程课程设计
- 2025年度个人车辆购置担保合同4篇
- 2025年度个人艺术品买卖合同示范文本4篇
- 二零二五年度高端别墅租赁合同样本汇编4篇
- 2025年度环保材料采购与资源循环利用合同3篇
- 2025年度珠宝首饰代销合同范本8篇
- 防水保温施工方案
- 2025年度原创剧本征集与奖金激励合同3篇
- 心力衰竭的治疗(基层诊疗与指南2024)
- 2024-2025学年冀教新版八年级上册数学期末复习试卷(含详解)
- 《子宫肉瘤》课件
- 《机器人驱动与运动控制》全套教学课件
- 电子商务平台技术服务合同范本1
- 期末 (试题) -2024-2025学年川教版(三起)英语四年级上册
- 2024年国家公务员考试公共基础知识复习题库及答案(共三套)
- 《社会工作实务》全册配套完整课件3
- 单位违反会风会书检讨书
- 《哪吒之魔童降世》中的哪吒形象分析
- 信息化运维服务信息化运维方案
评论
0/150
提交评论