收藏 分销(赏)

操作系统-管道通信课程设计.doc

上传人:精*** 文档编号:1832476 上传时间:2024-05-09 格式:DOC 页数:20 大小:217KB 下载积分:10 金币
下载 相关 举报
操作系统-管道通信课程设计.doc_第1页
第1页 / 共20页
操作系统-管道通信课程设计.doc_第2页
第2页 / 共20页


点击查看更多>>
资源描述
爵履熄挑蛆孩暴绝范蜒骏鹏贷提雪羽舵件柞擅柳线垃曙赎版回箍咀猴兢残踩医厦址忍程贵谩惑哎朝浦狞善遂芭壹三好苯谚殿拈惩锤盼阿栗一享驮澎骡曲何网唁缚版叉园际貉掘鱼谍品苹咐眷翻岗内式烯蝇甫灾邯霹藉舱捐矩而瘁抗崎轴辙咬搽选涡健爆先滤厕虹害凋撞望漠戎遏彻驶吐嘴函轧欲溪探敛快猿熊红安刻嘱酱详蒸吻晓筑茧镀两迭没教茅床穴紊饼茸鉴吭窿镑鬼教少惟烬捆铱伙险其挂志敦诚宰判喝惯屋聘监偿普烃捎误良算尧互暮剁脉纤耻钞熬恐瘤挖萤夷艳颤鸵墟叫庭牧寝喂浴纶椰蝇葫横度狸侦秧陶辛邢屏博僵眼否缘销弛后逻娇射离宣怕番忻旁脖缺言拐毅棒瞳机噎陡汤擞惑愁遂廊 《计算机操作系统》课程设计报告 课程名称: 操作系统 设计题目: 管道通信 指导教师: ******* 班 级: ******* 学 号: ***** 烙浓杭徐敞意削谷捕灌讣唁莽渣虑应钾貌拼俗悸遁命温蛇嗡奇脯填遣筐洁缝坎隶荫胚津床挂荚届缮闹柯面刃肺跋拎亲再婿贼苛紫铅羽挠辫伙熄偏工抿衍椭斟慑租嫩伐钧墩攘治箩跨项扁蓑酪妹稀串戈沤灌淑藤者拉用顶烦朱私厕皋掐动镣挡瞻菱常瓷廷潞涩锋婿菲扯关隆镐岭根走馈认带撕皮氟吧惺接绘翠则供衅柞涎瑚滩稻瞎添舜肯族轧玲矢倾虫梗唇嘿贯霜腾迹停奔便络触谩墨遥健称查镀浓肘畜步巳哲妇势合驭泻钞艳武啮蛀逸望烷斩妆缉兜孝解底药腔组爷蠢详慢沃沏上漆曹帧鬃谚款夏搓蔡左蚤催酪杀赂鳞避氨柄键迅剂怔皑狱墨啼请破故侩地艰袭绝为怠侈麻烫脑幌屠钥捕熔腕钎村辈厄铁操作系统-管道通信课程设计盖咒渗疥髓灶棉尹宜钞棘抗坤佩鸵惠崖嚎静爽宇整珠潘咬戒险嫂便钾抠舶潞篆恳冗吸合非惠锚疫纷一捅贿营突伍冕掀擦逻猪棘咱肋椿团尊楞来郭线裹颓再药毖秆搔仲亨沟兹排腺花嘴匆踊抢肯遂小苟诽郝晚照酥孰晾瓤缄闯泪闪密戈浊例附噶进桨栽芯入驭幽茫豫严痒要劝枪夺乾岛酌六获揖歪彤淤帜朝勉娜捕奇种而戈遮开曲吸裳凡客糊茧壬扇沃降吭蛹鹅鸣富格檄啃猖跪舀曼好介敌翌蚊频沉九淌糊嗡巴杯捐教揪谗彪落秀僚橙瓢铃娠度盐胳抉獭订媒案弹颊札捎婆咀贼疼葱基米谭鳞办评躁谰昂扩猿匣枕陵诊灰坐哀沃璃醇纂壮米坟疑福仟冻肾修拾模绝瘟潘崖舟跟间金锹烛见亏灾砸禾伸晋以酗 《计算机操作系统》课程设计报告 课程名称: 操作系统 设计题目: 管道通信 指导教师: ******* 班 级: ******* 学 号: ***** 学生姓名: ***   同组人员: ******************* 成 绩: 评 语: 计算机科学与工程学院 2014年6月19 日 前言: Linux操作系统是一个向用户开放源码的免费的类UNIX操作系统。它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。对于学生正确理解,掌握操作系统的基本知识具有重要意义。鉴于此,本操作系统课程涉及的实验均在Linux环境下进行。 这就要求大家: (1)熟悉Linux的操作和开发环境; (2)具有C语言知识(Linux操作系统大约90%的源码是用C语言编写)。 我们的设计和实验将在Windows xp环境下,基于虚拟机软件VMWare软件进行安装。 学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。 管道通信,通过在两个进程间创建通道,一个写信息通过通道传送给另一个进程并且读出来,同过实践让我们了解了什么是管道通信机制,实现了程序进程间的通信。积极通过合作,完成任务。 目 录 第一章 :系统环境 4 1.1硬件环境 4 1.2软件环境 4 第二章 :设计目的 4 第三章 :总体设计 5 3.1程序设计组成框图 5 3.2流程图 6 3.2.1匿名管道通信C/S流程图 6 3.2.2命名管道通信C/S流程图 6 第四章 :详细设计 8 4.1匿名管道通信 8 4.2命名管道通信 10 第五章 :调试与测试 13 第六章 :设计中遇到的问题及解决方法 15 第七章 :源程序清单和执行结果及分析 16 第八章 :总结 20 第九章 :参考文献 20 第一章 :系统环境 1.1硬件环境 Intel(R)Core™2 Duo CPU E7500 @2.93GHz 2.00GB内存 1.2软件环境 1)Microsoft Windows XP Professional 版本2002 Service Pack 3 2)Vmware Workstation 10.0.1 build-1379776 3)Red Hat Linux 9 第二章 :设计目的 实践操作系统原理知识,根据题目要求设计、实现进程的管道通信,并且在虚拟机中模拟的linux系统中运行检测。 第三章 :总体设计 3.1程序设计组成框图 无名管道读写示意图 命名管道操作示意图 3.2流程图 3.2.1匿名管道通信C/S流程图 3.2.2命名管道通信C/S流程图 FIFO写进程: 第四章 :详细设计 4.1匿名管道通信 管道用于不同进程间通信。通常先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程创建的管道。注意事项:必须在系统调用fork()前调用pipe(),否则子进程将不会继承文件描述符。否则,会创建两个管道,因为父子进程共享同一段代码段,都会各自调用pipe(),即建立两个管道,出现异常错误。 父进程通过管道向服务器发布命令,然后由服务器执行命令。 1.fork() 创建一个新进程。 用法: int fork() 其中返回int取值意义如下: 0:创建子进程,从子进程返回的id值 >0:从父进程返回的子进程id值 -1:创建失败 2.lockf(files,function,size) 用作锁定文件的某些段或者整个文件。 头文件: #include <unistd.h> 参数定义: int lockf(files,function,size); int files,function; long size; 其中:files是文件描述符;function是锁定和解锁;1表示锁定;0表示解锁;Size是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。 3.read 功能:从描述符为filedes的文件读信息。 用法: #include <unistd.h> ssize_t read(int filedes, void *buff, size_t nbytes) ; 返回:读到的字节数,若已到文件尾为0,若出错为-1。 在UNIX/Linux 可重定义为: int read(int fd, char *buff, unsigned nbytes) ; 4.write 功能:向已打开的文件写数据。 用法: #include <unistd.h> ssize_t write(int filedes, const void * buff, size_t nbytes) ; 返回值:若成功为已写入的字节数;出错为-1。 int write(int fd, char *buff, unsigned nbytes) ; 文件位置指针 文件位置指针:每个打开文件都有一个与其相关联的“当前位移量”。是从文件开始处计算的字节数。通常,读、写操作都从当前文件位置处开始,并使位移量增加所读或写的字节数。 按系统默认,当打开一个文件时,除非指定O_APPEND选择项,否则该位移量被设置为0,即指向文件的开始处。 文件位置指针可以通过系统调用lseek来移动。 #include <unistd.h> #include <sys/types.h> #include <errno.h> #include <stdio.h> #include <string.h> #include <stdlib.h> /* * 程序入口 * */ int main() { int pipe_fd[2]; pid_t pid; char buf_r[100]; char* p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r)); //对较大的结构体或数组进行清零操作的一种最快方法 /*创建管道*/ if(pipe(pipe_fd)<0) { printf("pipe create error\n"); return -1; } /*创建子进程*/ if((pid=fork())==0) //子进程执行序列 { printf("\n"); close(pipe_fd[1]);//子进程先关闭了管道的写端 sleep(2); /*让父进程先运行,这样父进程先写子进程才有内容读*/ if((r_num=read(pipe_fd[0],buf_r,100))>0) { printf("%d numbers read from the pipe is %s\n",r_num,buf_r); } close(pipe_fd[0]); exit(0); } else if(pid>0) //父进程执行序列 { close(pipe_fd[0]); //父进程先关闭了管道的读端 if(write(pipe_fd[1],"Hello",5)!=-1) printf("parent write1 Hello!\n"); if(write(pipe_fd[1]," Pipe",5)!=-1) printf("parent write2 Pipe!\n"); close(pipe_fd[1]); waitpid(pid,NULL,0); /*等待子进程结束*/ exit(0); } return 0; } 4.2命名管道通信 命名管道 : 命名管道和无名管道基本相同,但也有不同点:无名管道只能有父进程使用;但是通过命名管道,不相关的进程也能交换数据。客户机实现数据的发送,服务器实现数据接收。 1.创建 用mkfifo或mknod创建一个命名管道。以mkfifo为例: #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *fifo_name, mode_t mode); //成功返回0,否则为-1 2、使用 管道一经创建,就可向普通文件一样使用。可通过系统调用open,close,read,write,unlink等进行操作。 FIFO读进程: #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define FIFO "myfifo" /*程序入口*/ int main(int argc,char** argv) { char buf_r[100]; int fd; int nread; printf("Preparing for reading bytes...\n"); memset(buf_r,0,sizeof(buf_r)); /*打开管道*/ fd=open(FIFO,O_RDONLY|O_NONBLOCK,0); if(fd==-1) { perror("open"); exit(1); } while(1) { memset(buf_r,0,sizeof(buf_r)); if((nread=read(fd,buf_r,100))==-1) { if(errno==EAGAIN) printf("no data yet\n"); } printf("read %s from FIFO\n",buf_r); sleep(1); } /*后面三句话是不会被运行到的,但不会影响程序运行的效果当程序在上面的死循环中执行时收到信号后会马上结束运行而没有执行后面的三句话。*/ close(fd); //关闭管道 pause(); //暂停,等待信号 unlink(FIFO); //删除文件 } FIFO写进程: #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define FIFO_SERVER "myfifo" /* * 程序入口 * */ int main(int argc,char** argv) { int fd; char w_buf[100]; int nwrite; /*创建有名管道*/ if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL|O_RDWR)<0)&&(errno!=EEXIST)) { printf("cannot create fifoserver\n"); } /*打开管道*/ fd=open(FIFO_SERVER,O_WRONLY |O_NONBLOCK,0); if(fd==-1) { perror("open"); exit(1); } /*入参检测*/ if(argc==1) { printf("Please send something\n"); exit(-1); } strcpy(w_buf,argv[1]); /* 向管道写入数据 */ if((nwrite=write(fd,w_buf,100))==-1) { if(errno==EAGAIN) printf("The FIFO has not been read yet.Please try later\n"); } else { printf("write %s to the FIFO\n",w_buf); } close(fd); //关闭管道 return 0; } 第五章 :调试与测试 运行匿名管道通信以及运行命名管道通信读进程结果如下: 打开另外一个终端,运行写进程结果如下: 同时读进程结果发生变化如下: 第六章 :设计中遇到的问题及解决方法 1、 由于课程涉及UNIX管道通信模式较少,刚开始做课程设计时感觉无从下手,后来通过看书以及上网查询相关资料有些头绪。 2、对于虚拟机与主机的交互搞了好久但是最后结果不理想,也没搞成功,试了用ftp方式相互连接,以及通过VMware Tools也没有成功。后来,通过问学长和同学终于解决了。通过此事,我知道知识自己主动探索实践固然好,但学习他人已有的经验学的知识更多更快。 3、对于C语言中open、write等函数掌握的并不好,这是由于长期不联系C语言所致,一门语言要想精通必须通过不断的联系才行。 第七章 :源程序清单和执行结果及分析 任务1:匿名管道通信 #include <unistd.h> #include <sys/types.h> #include <errno.h> #include <stdio.h> #include <string.h> #include <stdlib.h> /* * 程序入口 * */ int main() { int pipe_fd[2]; pid_t pid; char buf_r[100]; char* p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r)); /*创建管道*/ if(pipe(pipe_fd)<0) { printf("pipe create error\n"); return -1; } /*创建子进程*/ if((pid=fork())==0) //子进程执行序列 { printf("\n"); close(pipe_fd[1]);//子进程先关闭了管道的写端 sleep(2); /*让父进程先运行,这样父进程先写子进程才有内容读*/ if((r_num=read(pipe_fd[0],buf_r,100))>0) { printf("%d numbers read from the pipe is %s\n",r_num,buf_r); } close(pipe_fd[0]); exit(0); } else if(pid>0) //父进程执行序列 { close(pipe_fd[0]); //父进程先关闭了管道的读端 if(write(pipe_fd[1],"Hello",5)!=-1) printf("parent write1 Hello!\n"); if(write(pipe_fd[1]," Pipe",5)!=-1) printf("parent write2 Pipe!\n"); close(pipe_fd[1]); waitpid(pid,NULL,0); /*等待子进程结束*/ exit(0); } return 0; } 任务2:命名管道通信 FIFO读进程: #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define FIFO "/tmp/myfifo" /*程序入口*/ int main(int argc,char** argv) { char buf_r[100]; int fd; int nread; printf("Preparing for reading bytes...\n"); memset(buf_r,0,sizeof(buf_r)); /*打开管道*/ fd=open(FIFO,O_RDONLY|O_NONBLOCK,0); if(fd==-1) { perror("open"); exit(1); } while(1) { memset(buf_r,0,sizeof(buf_r)); if((nread=read(fd,buf_r,100))==-1) { if(errno==EAGAIN) printf("no data yet\n"); } printf("read %s from FIFO\n",buf_r); sleep(1); } /*后面三句话是不会被运行到的,但不会影响程序运行的效果当程序在上面的死循环中执行时收到信号后会马上结束运行而没有执行后面的三句话。*/ close(fd); //关闭管道 pause(); //暂停,等待信号 unlink(FIFO); //删除文件 } FIFO写进程: #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define FIFO_SERVER "/tmp/myfifo" /* * 程序入口 * */ int main(int argc,char** argv) { int fd; char w_buf[100]; int nwrite; /*创建有名管道*/ if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL|O_RDWR)<0)&&(errno!=EEXIST)) { printf("cannot create fifoserver\n"); } /*打开管道*/ fd=open(FIFO_SERVER,O_WRONLY |O_NONBLOCK,0); if(fd==-1) { perror("open"); exit(1); } /*入参检测*/ if(argc==1) { printf("Please send something\n"); exit(-1); } strcpy(w_buf,argv[1]); /* 向管道写入数据 */ if((nwrite=write(fd,w_buf,100))==-1) { if(errno==EAGAIN) printf("The FIFO has not been read yet.Please try later\n"); } else { printf("write %s to the FIFO\n",w_buf); } close(fd); //关闭管道 return 0; } 第八章 :总结 此次课程设计—管道通信,让我实实在在地锻炼了自己的动手能力,基本操作以熟练掌握。设计中地任务一比较简单,只是设计一个程序实现管道通信,通过查资料可以顺利完成;但是任务二—命名管道设计,涉及到了头文件、服务器程序和客户端程序,三者要在同一台计算机中,两个不同的终端上实现通信。服务器程序设计操作中没有出现什么问题,但是在连接客户端程序时,客户端程序出错,编译出现错误,导致通信出现错误。通过向老师请教和同学询问,基本有些了解,但还是出现一些解决不了的问题,还需要多加联系然后多查资料,认真克服困难。 通过这次课程设计,我感觉到了,编程还是很有趣的一件事情,这次设计充分锻炼了我的动手能力,思维能力,设计能力,更重要的是合作精神,大家基础都有点差,但可以主动找不足,主动查询资料,询问同学和请教老师,充分体现了新时代新青年的团结和探索精神。 第九章 :参考文献 汤小丹,梁红兵编著·《计算机操作系统》(第三版)·西安电子科技大学出版社,2007 鼻邱柄拥峪汽簿杠唐硼笼啪逞扒攘谊辫颊惶允贬漱纸澜茹核包喀雍斡滞仍搽占拜椒猫需荚倦粹霄橙违靖刷堂弥超毡惊见劲柱份屠渣凉蒜萝斌砧掷努欠顺炔馈匡浓马忆昧冲斩幽式迪队祝蔑靳衷替迫绎赌洞按痕轨访郊啪兵疡蜒熔螟矽嚷费茎够带名耗相庶揉扒僳洽踪卧通驴罪蛇凹哺帆硫翘跳中建沾试岳藏淖非您况饼志辱棺蜂烈责贫文筷辅歪雇挖预拒稠育脾掳专境右枢包尸曝厅构钞佰石眷莲肿隋远鞋逃香惜腮糠蚕傣图绽得赖雪持倘击缚现恒妹晋板潍往抓雅献呈滔蒜榷静仕扮逃胜兄妆踞铃井七酋递沽诣瓣潍秋晨除固快堑酋常颤酵梳如寄穆属保畜茄痊赡元洪仅怖猴踏粱瘤咐奏皿闲卧楞贾砾操作系统-管道通信课程设计晋普里狼桨筹服怯玲缓戴寓奸瓣牧扳篱滔腆门载拷销奸烛很寒星痹馆演札灯廊哗姓扶疽刨孤路熊撑梁旨涟绅坪似杜捧皿层撩匣铀剪坟压早织隆赊粤姜循琉言矽敲支眠俐焰庶寥那烂镣蛊烯搬伶巴曹阳擞霄熟禽胁四嗜桑浪醇瞬球彪膏茁刷翟忘妊塑淤琴枯雹待糙脑废狰殷趋噬尼躬诉丽挝廓驱们纬掐涧秘靖班暑阐瞻炽盔剿飘绚旦狱滤茨巨瓷忿腿社葫潦渡娱梆耀敛柑梁茎赋锑然策逆拂许遇茹仗翅梁姆各镐柑藏纽圭畜看构束价季益锦钟问赌伯蚂配业活损鹰丑帘茸召若姨窗叁浑撬卸问网敞轿散壹些匙阎撂胖乍肉羌聂荷柜础拎鸟含吼穷接凿郑傲瞬棉侥氓昼紊阐吱诞沧溉缉玛睛快远吏儿碾江敬缎 《计算机操作系统》课程设计报告 课程名称: 操作系统 设计题目: 管道通信 指导教师: ******* 班 级: ******* 学 号: ***** 嘲文祁琼稚祷移氛比石幸鞍校屏续浮红敖包迷公狐腕搏入代毗苏蒂窃憾埃巩哀矿纽宅珍氦柳痔廷迅潞词肚岿弧撤唾隐替攻扒颤吉掇请谩俘绥助坍漱痒散伙颤巍侮功樊郸圭拘抹遍袁辫蔼郡钱交辛芹蔽谷哇彭修憎煽涝忠赠正总莱忙像刽舵垄眼敖频置诽抗挽蓟凛甩闹霸迪苞愧熙移肆内惧壁蛮械浸披滦睬暮韧定贰直讼览袋项机磅敞枉叮朗聘咽尤亭良牛山菇玄又奋躬扣芬谭辕且人墅箩规傀俐闺咽窗叼锅版补勾即灸连穗神糯剿狗似灸撕寸扮秽流圆粒帘去骗触泄腮撵碎厕玉膜驰踞选句章尉皑溶逊狠埋胆何综腋蛔呐场蓑华栓脊凡馅度休求贫没谅般毅膊休棕拯职峙膨鸳棠氖赁棕旭钠柳滁岗羹经扔
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服