下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三 进程通讯实验报告【姓名】【学号】【实验题目】进程通讯消息队列与共享存储区【实验目的】( 1) 掌握进程间通讯的编程方法;( 2) 加深对进程并发执行的理解;( 3) 学习利用消息队列和共享存储区实现进程通信的方法。【实验内容】设计一个多进程并发运行的程序,它由不同的进程完成下列工作:( 1)接收键盘输入进程负责接收用户的键盘输入,并以适当的方式将由键盘获得的数据交给其它进程处理。( 2)显示进程负责全部数据显示任务,包括键盘输入数据的显示和提示信息的显示。( 3)分发数据进程将键盘输入的数据分为 3 类,即字母、数字和其它,并分别将字母写入文件中,数字写入文件中,除字母和数字外其它数据
2、丢弃。【实验要求】1 、 程序能以适当的方式提示用户输入数据;2 、 提示用户有数据被丢弃;3 、 全部的显示任务必须由显示进程完成;4 、 整个程序能够连续处理多组输入数据,直到用户输入“ quit ”字符串,整个程序 结束;5 、 进一步要求:同时采用共享存储区和消息 2 种方法实现进程之间的通信,并比较 这 2 种通信方法的利弊。【实验方法】1 、 利用 fork() 函数创建 2 个子进程,用一个父进程和两个子进程完成上面的三个实验任务,用子进程1 实现分发数据任务,子进程2 实现接受键盘输入任务,父进程实现全部的显示任务。2 、 同时通过共享存储区和消息队列两种进程通讯方式实现上面三
3、个进程之间的同步和互斥。3 、 利用 while() 循环、 kill() 函数和 signal() 函数实现连续多组数据输入。【程序结构】 数据结构:消息队列、字符数组; 程序结构:顺序结构、if-else分支结构和while循环结构; 主要算法:无特别算法【实验结果】1 、有代表性的执行结果:stud13localhost stud13$ cc stud13localhost stud13$ ./ Please input a line:Loperatingsystem01234-=,.Your message is:operatingsystem01234-=,.The characte
4、rs deserted are:Please input a line:Lxushengju6651001!#$%A&*()Your message is:xushengju6651001!#$%A&*()The characters deserted are:!#$%A&*()Please input a line:LHello123Your message is:Hello123Please input a line:quitstud13localhost stud13$ catOperatingsystemxushengjuHellostud13localhost
5、 stud13$ cat03stud13localhost stud13$2 、结果分析及解释:在创建子进程1 时,由于先返回子进程的 ID 号, msgrcv(msgid,&msg,BUFSIZE,0,0)一直都是非0 值,故循环等待。接着返回父进程ID ,父进程负责全部的显示任务,先提示用户输入“ Please input a line : ” ,然后等待子进程2 的 16 信号所以当子进程2 负责从键盘接收字符,当输入“ operatingsystem01234-=,. ”后,由子进程2 发送消息(内容为:operatingsystem01234-=,. ) 给子进程 1, 由子
6、进程 1 实现分发任务, 将字符输出到文件 “” ,将数字输出到文件“” ,将其他字符写到“抛弃字符共享存储区array ”并将从消息队列中读取的字符串写到字符共享存储区 addr 中, 再向父进程发送 16 信号, 实现进程之间的同步;之后由父进程接收16 信号后, 从 addr 共享存储区中获取由键盘输入的字符串, 并由终端输出显示,若有字符丢弃,同时也提醒用户有哪些字符被丢弃了,显示到终端。通过while()循环, 实现多组数据输入并显示和分发写入文件。 当用户需要退出时, 从终端输入” quit ”,所有子进程退出,由父进程断开和共享存储区的附接并删除消息队列,之后也退出。【问题分析】
7、实验中出现的问题及解决办法:1、比较消息队列和共享存储区在消息通信机制中的数据传输的时间和性能:由于两种机制实现的机理和用处都不一样, 难以直接进行时间上的比较。 如果比较其性能,应更加全面地分析。 ?消息队列的建立比共享区的建立消耗的资源少。 前者只是一个软件上设定的问题, 后者需要对硬件操作, 实现内存的映像, 当然控制起来比前者复杂, 如果每次都更新进行队列或共享的建立,共享区的设立没有什么优势。 ?当消息队列和共享区建立好后, 共享区的数据传输受到系统硬件的支持, 不耗费多余 的资源;而消息传递由软件进行控制和实现,需要消耗一定的CPU资源。从这个意义上讲,共享区更适合频繁和大量的数据
8、传输。消息的传递, 自身就带有同步的控制。 当等到消息的时候, 进程进入睡眠状态, 不再 消耗CPU资源。而共享队列如果不借助其他机制进行同步,接收数据的一方必须进行不断的查询,进入忙等待状态,白白浪费了大量的CPU资源。可见,消息方式的使用更加灵活。2、有关字符数组初始化函数的使用:在本实验中频繁使用了 memset() 函数,且第二个参数均为 0,是为了将每次从键盘输入的字符串都能存到一个空的字符数组中,以防止字符的重复和覆盖。3、在本程序中,需要合理安排父进程和2 个子进程的任务,由父进程来负责显示任务是最合理和最简单的情况, 因为父进程与子进程在某些方面是共享的, 无需另外启用消息通
9、信机制。而且在实现多组数据的输入、显示和分发方面能实现很好的同步和互斥。4、注意消息缓冲区的数据结构,主要用来存放需要发送或者接收的消息类型和消息正文,在 /usr/src/include/linux/ 中描述如下:/*message buffer for msgsnd and msgrcv calls*/struct msgbuflong mtype; / 消息类型,由用户决定char mtextMAXMSG;/ 消息正文;5、在程序修改之前存在一个bug,就是在输入的字符串中不能存在空格或制表符,如果出现空格或者制表符, 将只会显示空格或者制表符后面的内容, 前面的不显示。 这是由于 sc
10、anf() 函数的作用,当他遇到空格或制表符时,就会只读入后面的内容。有人想到会用 gets() 来接受一行,但是懂C 的人基本上都知道gets() 是一个很危险的函数,而且很难控制, 特别是与 scanf() 交替使用时前者的劣势更是一览无余, 所以 gets() 一般是不推荐用的。 那么我们可以用 Nn%*c控制语句来隔离掉其中的空格或者制表符对读入一行字符串的 影响。 【程序清单】 下面为可执行的 C程序清单以及相应的注释: /* 进程通信之消息队列与共享存储区*/#include<> #include<> #include<> #include<
11、;> #include<sys/> #include<sys/> #include<sys/> #include<linux/> #include<linux/> #include<linux/> #include<> #include<> #define MAXMSG 128 / 消息队列的最大长度#define BUFSIZE 128 / 缓冲区的最大长度/* 定义消息的数据结构*/struct my_msglong int mtype; /消息类型char mtextMAXMSG; /
12、消息内容 msg;int pid,pid1,pid2;/ 定义父进程和两个子进程的 id 标识int i,j;char bufferBUFSIZE,msgtextMAXMSG; / 定义缓冲区和接受暂存字符数组void stop()main()/* 定义共享内存*/int shmid1,shmid2;/定义2 个共享存储区的内部标识char *addr,*array;/* 创建并附接共享内存*/shmid1=shmget(IPC_PRIVATE,BUFSIZE,IPC_CREAT|0666);shmid2=shmget(IPC_PRIVATE,BUFSIZE,IPC_CREAT|0666);a
13、ddr=(char *)shmat(shmid1,NULL,0);array=(char *)shmat(shmid2,NULL,0);/* 创建消息队列并初始化 */int msgid;msgid=msgget(IPC_PRIVATE,IPC_CREAT|0666);pid=getpid();/ 获取父进程ID 号while(pid1=fork()=-1);if(pid1>0)while(pid2=fork()=-1);if(pid2=0)while(1)memset(buffer,'0',0);scanf("%Fn%*c”,buffer);从终端输入字符串m
14、emset,'0',0);strcpy,buffer);=1;/设置消息类型为 1if(msgsnd(msgid,&msg,MAXMSG,0)<0)return0;/ 向子进程 1 发送消息if(strcmp(buffer,"quit")=0)break; exit(0); elseprintf("Please input a line:n");/提示输入while(1)signal(16,stop);/接收子进程发送的信号pause();/父进程挂起if(strcmp(addr,"quit")=0)br
15、eak;/ 判断是否退出并终止循环printf("Your message is:n%sn",addr);/输出从终端输入的内容if(strlen(array)!=0)/输出被抛弃的字符printf("The characters deserted are:n%sn",array);memset(addr,'0',0);printf("Please input a line:n");wait(0);wait(0);/* 断开附接 */shmdt(addr);shmdt(array);/* 撤销共享内存*/shmctl(
16、shmid1,IPC_RMID,0);shmctl(shmid2,IPC_RMID,0);/* 删除消息队列 */msgctl(msgid,IPC_RMID,0);exit(0);elseFILE *fp1,*fp2;fp1=fopen("","w");/打开文件fp2=fopen("","w");while(1)if(!msgrcv(msgid,&msg,BUFSIZE,0,0)return 0;/接收消息i=0;j=0;memset(msgtext,'0',sizeof(msgtext);memset(array,'0',sizeof(array);strcpy(msgtext,;strcpy(addr,;if(strcmp(msgtext,"quit")=0) / 判断是否退出,若是则向父进程发送信号并退出循环kill(pid,16);break;while(i<strlen(msgtext) /分类输入到文件,并将要抛弃的字符输入 array 存储区if(msgtexti>='a'&&msgtexti<='z')| (msgtexti>=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机修内部管理制度及流程
- 沈阳职业技术学院《专业前沿讲座》2024-2025学年第二学期期末试卷
- 机关内部考勤制度
- 机构内部交易纪录制度
- 杭州完善内部控制制度
- 果园内部管理制度范本
- 核酸采样站内部管理制度
- 检验科内部考核制度范本
- 民办教育内部控制制度
- 民族乐团内部管理制度
- 2026年山东单招财经商贸大类会计专业能力测试题库含答案
- 2025年学校领导干部民主生活会“五个带头”对照检查发言材料
- 高清无人机迷你简易推广方案
- 围麻醉期应激反应的调控策略
- 2026年山东经贸职业学院单招综合素质考试题库及参考答案详解1套
- 皮革质保合同范本
- 2025年10月自考04741计算机网络原理试题及答案含评分参考
- T-CASEI 026-2023 在役立式圆筒形钢制焊接储罐安全附件检验技术标准
- 车辆智能共享出行技术课件 第7章 共享出行定制化车辆关键技术
- 家电销售实战话术
- 2025年全国统一高考英语试卷(新高考Ⅱ)
评论
0/150
提交评论