教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 高等教育 >

操作系统实验三报告

来源:网络收集 时间:2026-08-05
导读: 操作系统实验报告 实验三:进程通信(二)消息通信 一、 实验目的 1、理解什么是消息通信以及如何进行消息通信 2、 二、 实验内容 任务: (1)每个同学登陆两个窗口,先在一个窗口中运行程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),用i

操作系统实验报告

实验三:进程通信(二)消息通信

一、 实验目的

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 #include #include #define MSGKEY 007 struct msgform {

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 #include #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 #include #include #include #define MSGKEY 007 int i,j;

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()函数解决。

四、 …… 此处隐藏:1925字,全部文档内容请下载后查看。喜欢就下载吧 ……

操作系统实验三报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/615332.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)