欢迎来到天天文库
浏览记录
ID:57674404
大小:1.07 MB
页数:10页
时间:2020-08-31
《中的c语言编程消息传递系统.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、操作系统第五次实验张焓1.实验名称:项目:消息队列通信2.实验目的:服务进程只有一个,接收个客户进程以消息形式发出的问题,接收键盘输入作为回答,再以消息形式送给提问的程序。各客户进程接收键盘输入作为问题,以消息形式发给服务进程,等待接收服务进程发来的回答消息,再开始下一轮的循环。a.程序不停执行,直到用户用ctrl+c杀死进程b.程序不停执行,直到用户键入end,进程结束执行3.实验方法(1)首先编写客户进程:包含需要用到的头文件,并定义结构体msgform作为报文结构用于存放报文:(2)作一些定义及声明:(3)创建消息队列,并添加必要的错误处理
2、,标识码1234:(1)接收消息队列中的报文,添加必要的错误处理,并在屏幕打印接收到的报文消息,为了方便观察,我们在这里顺带显示一下进程的pid。另外,在a情况下此段程序如图,在b情况下,将注释部分的注释符去掉即可:(2)清空并删除消息队列,并且添加必要的错误处理:(3)如整个程序正常运行,则退出进程:(4)编写服务进程:包含需要用到的头文件,并定义结构体msgform作为报文结构用于存放报文(同(1)):(5)在服务进程中启动客户进程:(6)作一些定义及声明:(1)创建消息队列,并添加必要的错误处理,标识码1234:(2)从键盘输入一组字符串,
3、存入临时的字符串数组作为报文内容,并定义报文类型。为方便观察,在屏幕打印服务进程接收到的信息的报文消息,为了方便观察,我们在这里顺带显示一下进程的pid:(3)将报文写入到消息队列中的,添加必要的错误处理。另外,在a情况下此段程序如图,在b情况下,将注释部分的注释符去掉即可:(4)进程执行完毕后,正常退出。(5)在命令行中运行:情景a.情景b.1.实验步骤(1)启动计算机并运行VisualStudio2015;(2)打开终端进行程序书写多线程计算举证的程序代码;(3)生成解决方案后再命令提示行中运行编译得到的可执行程序;(4)分析运行出现的问题;
4、(5)观察运行结果,并思考;(6)退出,并写出实验报告;2.主要结论在进程间的通信实验中,我采用了内存共享的方式将父子进程进行了通信,在本次实验,我成功的使用了消息队列使得两进程间能够通信。3.分析和讨论消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队
5、列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。附录:client.c:#include#include#include#include#includestructmsgform{longmtype;charmtext[256];};intmain(){structmsgformmsg;intrunning=1;intpid;intmsgqid=-1,reval=-1;charbuffer[256]
6、;msgqid=msgget((key_t)1234,0666
7、IPC_CREAT);if(msgqid==-1){printf("msgcreateerror!!");exit(EXIT_FAILURE);}pid=getpid();msg.mtype=0;while(running){if(msgrcv(msgqid,&msg,256,1,0)==-1){printf("client:msgreceiveerror!!");exit(EXIT_FAILURE);}printf("client:receivefrompid%dyouwr
8、ite:%s",pid,msg.mtext);if(strncmp(msg.mtext,"end",3)==0)running=0;}if(msgctl(msgqid,IPC_RMID,0)==-1){printf("msgctlfailed");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);}server.c:#include#include#include#include#includestructmsg
9、form{longmtype;charmtext[256];};intmain(){intchild;if((child=fork())
此文档下载收益归作者所有