操作系统实验三报告
操作系统实验报告
实验三:进程通信(二)消息通信
一、 实验目的
1、理解什么是消息通信以及如何进行消息通信 2、
二、 实验内容
任务:
(1)每个同学登陆两个窗口,先在一个窗口中运行程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),用ipcs命令查看系统中消息队列的情况,然后在另一个窗口中运行程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行,再次用ipcs命令观察系统中消息队列的情况。 (2)使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1K的消息的发送和接收程序。
①为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。
②SERVER端建立一个Key为学号末3位的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER每接收到一个消息后显示一句“(server)received”。
③CLIENT端使用key为学号末3位的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(client)sent”。
④父进程在SERVER和CLIENT均退出后结束。
三、 代码及运行结果分析 (1)
程序1:
#include
long mtype;
char mtext [256]; }msg; int msgqid; main () {
int i ,pid, *pint; extern cleanup();
for (i=0;i<20;i++)/*软中断处理*/ signal (i,cleanup);
msgqid = msgget (MSGKEY,0777|IPC_CREAT);/*建立消息队列*/ for (;;) {
msgrcv (msgqid ,&msg,256,1,0);/*接收来自顾客进程的消息*/ pint=(int * ) msg. mtext; pid = * pint;
printf (\ msg.mtype=pid; *pint=getpid();
msgsnd (msgqid,&msg ,sizeof (int) ,0) ;/*发送应答消息*/ } }
cleanup() {
msgctl (msgqid ,IPC_RMID,0); exit(); }
程序2:
#include
#define MSGKEY 007 /*key值与程序1 相同*/
struct msgform {
long mtype;
char mtext [256]; }; main() {
struct msgform msg; int msgqid,pid, *pint;
msgqid=msgget(MSGKEY,0777);/*获取消息队列标识符*/ pid=getpid();
pint=(int *)msg.mtext;
*pint=pid;
msg.mtype=1;/*指定消息类型*/
msgsnd(msgqid,&msg,sizeof(int),0);/*往msgqid发送消息msg*/ msgrcv(msgqid,&msg,256,pid,0);/*接收来自服务进程的消息*/ printf(\}
在后台运行程序1,用ipcs查看:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status ? ? ? ? ? ? ? ------ Semaphore Arrays --------
key semid owner perms nsems ------ Message Queues --------
key msqid owner perms used-bytes messages ? ? ? ? ? ? 0x00000007 1867791 e06620336 777 0 0 运行程序2,用ipcs查看:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status ? ? ? ? ? ? ? ------ Semaphore Arrays --------
key semid owner perms nsems
------ Message Queues --------
key msqid owner perms used-bytes messages ? ? ? ? ? ? 0x00000007 1867791 e06620336 777 0 0
用ctrl+c结束程序1,用ipcs查看: [e06620336@localhost e06620336]$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch stat ? ? ? ? ? ? ? ------ Semaphore Arrays --------
key semid owner perms nsems ------ Message Queues --------
key msqid owner perms used-bytes messages ? ? ? ? ? ? 0x00000007 1867791 e06620336 777 0 0 分析:程序1和程序2实现的是两个进程间通过消息队列传递信息的功能。先在后台运行程序1,等待接受程序2传递的消息,用ipcs观察到一个msqid为1867791的消息队列存在;接着运行程序2 ,观察到运行结果server接收到pid为26938的进程发送的消息,client接收到pid为26371发送的应答消息,且消息队列中仍存在msqid=1867791的消息队列。结束程序1后,再用ipcs查看,消息队列msqid=1867791仍然存在这是后台运行程序1的情况。但是用两个窗口分别运行程序1和程序2,结束程序1后,发现消息队列中不存在msqid=1867791的消息队列,表明该消息队列已不起作用。从理论上来看,程序1结束后,消息队列不存在,和两个窗口的运行结果一样。因为消息队列msqid=1867791是由程序1创建的,程序2只是获取了它的标识符而已。
(2) 程序3
#include
struct msgform {
long mtype;
char mtext [1024]; }msg; int msgqid; void server(){
msgqid = msgget (MSGKEY,0777|IPC_CREAT);/*建立消息队列*/ for (;;) {
msgrcv (msgqid,&msg,1024,0,0);/*接收来自顾客进程的消息*/ printf(\ if(msg.mtype==1){ /*接收的消息类型为1,则结束消息队列,退出*/ msgctl(msgqid,IPC_RMID,0); exit(0); } }
}
void client(){ int k; msgqid=msgget(MSGKEY,0777);/*获取消息队列标识符*/ for(k=10;k>=1;k--){ msg.mtype=k;/*指定消息类型为1——10*/ msgsnd(msgqid,&msg,1024,0);/*往msgqid发送消息msg*/ printf(\ } exit(0); /*消息发送完毕,退出*/ }
main(){
/*产生两个子进程,作为server进程和client进程*/ while((i=fork())==-1); if(!i) server();
else{ while((j=fork())==-1); if(!j) client();
}
wait(0); wait(0);/*等待两个子进程结束*/ }
运行程序3,:
分析:从运行结果可以看出,server和client分别sent和received 10次。消息队列将接收和发送两个过程独立,避免了同步问题。但是程序3存在着应答不及时的问题,考虑是否可以通过在client中添加sleep()函数解决。
相关推荐:
- [高等教育]公司协助某村精准扶贫工作总结.doc
- [高等教育]高二生物知识点总结(全)
- [高等教育]苏教版数学三年级下册《解决问题的策略
- [高等教育]仪器分析课程学习心得
- [高等教育]2017年五邑大学数学与计算科学学院333
- [高等教育]人教版七年级下册语文第四单元测试题(
- [高等教育]2018年秋七年级英语上册Unit7Howmuchar
- [高等教育]2017年八年级下数学教学工作小结
- [高等教育]湖南省怀化市2019届高三统一模拟考试(
- [高等教育]四年级下册科学_基础训练及答案教材
- [高等教育]城郊煤矿西风井管路伸缩器更换施工安全
- [高等教育]昆八中20182019学年度上学期期末考试
- [高等教育]项目部各类人员任命书
- [高等教育]上市公司经营水务产业的模式
- [高等教育]人教版高二化学第一学期第三章水溶液中
- [高等教育]【中考物理第一轮复习资料】四.压强与
- [高等教育]金坑水电站报废改建工程机电设备更新改
- [高等教育]高中生物教学工作计划简易版
- [高等教育]2017年西华大学攀枝花学院(联合办学)44
- [高等教育]最新整理超短爆笑英文小笑话大全
- 优秀教师继续教育学习心得体会
- 阳历到阴历的转换
- 留守儿童教育案例分析
- 华师17春秋学期《玩教具制作与环境布置
- 测速传感器新型安装装置的现场应用
- 人教版小学数学三年级下册第四单元
- 创业个人意向书
- 山东省潍坊市2012年高考仿真试题(三)
- [恒心][好卷速递]四川省成都外国语学校
- 多少人错把好转反应当成了病情加重处理
- 中外广播电视史复习资料整理
- 江苏省扬州市江都区宜陵镇中学2014-201
- 工程造价专业毕业实习报告
- 广西师范学院心理与教育统计
- aympkrq基于 - asp的博客网站设计与开
- 建筑业外出经营相关流程操作(营改增后
- 人治 德治 法治
- [精华篇]常识判断专项训练题库
- 中国共产党为什么要实行民主集中
- 小学数学第三册第一单元试卷(A、B、C




