西北工业大学-操作系统实验报告-实验七

2020-06-05 09:18

实验七 消息及其传送机制

一、 实验目的

(1)了解什么是消息。 (2)熟悉消息传送的机理。

二、 实验内容与要求

1、消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为256Bytes的消息发送和接收的程序,将自己的进程号传递给对方,并输出至屏幕。

2、对整个实验过程进行分析总结,给出详细步骤。

三、 实验过程

1、编写程序实现消息的创建、发送和接收。将参考程序用vi编辑器录入,然后编译执行。

1、 client.c

#include

#include #include #include #include

#define MSGKEY 75 /*定义一个消息关键字*/

struct msgform /*定义一个结构,它是一个消息的模式,只说明结构的形式*/ { long mtype; /*消息类型*/

char mtext[256]; /*消息正文数组*/ };

int main(){ {struct msgform msg; /*定义msg是前面说明的消息结构类型的变量*/ int msggid,pid,*pint; msggid=msgget(MSGKEY,0777); /*用系统调用创建一个消息队列*/ pid=getpid(); /*获得当前进程的PID*/ printf(“client:pid=%d\\n”, pid); pint=(int*)msg.mtext; /*将消息正文的头指针赋给指针变量pint*/ *pint=pid;

msg.mtype=1; /*指定客户进程的消息类型为1*/

msgsnd(msggid,&msg,sizeof(int),0); /*向msggid的消息队列发送消息msg*/ msgrcv(msggid,&msg,256,pid,0); /*接收pid类型的消息 */ printf(“client:receive from pid %d\\n”,*pint); return 0;

}

2、server.c

#include #include #include #include < signal.h> #include #include #include

#define MSGKEY 75 /*定义一个消息关键字*/

struct msgform /*定义一个与客户端相同的消息关键字*/ { long mtype; /*消息类型*/

char mtext[256]; /*消息正文数组*/

}msg; /*也可以使用这种方式说明消息结构变量*/

void cleanup(int signo); /*说明一个外部函数*/

int msgqid;

int main() {int i,pid,*pint; for ( i=0; i<23; i++) /*对22个软中断的特殊处理*/ signal(i, cleanup); /*若收到22个软中断,转向执行cleanup*/ msggid=msgget(MSGKEY,0777|IPC_CREAT); /*创建一个与客户程序相同关键字的消息队列,但它的标志是0777与IPC_CREAT 做“或”操作的结果*/ printf(“server:pid=%d\\n”, getpid()); /*输出服务端的进程ID*/ for(;;) /*用无限循环完成下列语句*/

{ msgrcv(msggid,&msg,256,1,0); /*接收来自客户进程或类型为1的消息 */

pint=(int*)msg.mtext; /*将客户端的消息正文传递给pint*/ pid=*pint; /*将读出消息指针送pid,此时*pint中是客户进程的pid值*/ printf(“server:receive from pid %d\\n”,pid); msg.mtype=pid; /*已接受客户进程的pid为消息类型*/ *pint=getpid(); /*以本进程pid作为消息构成消息传递内容*/ msgsnd(msggid,&msg,sizeof(int),0); /*发送消息*/ }

}

void cleanup(int signo) { msgctl(msggid , IPC_RMID , 0); /*删除消息队列*/ exit(0); }

如下图所示:

client.c

server.c

运行结果如下所示:

2、思考题

(1)单独执行client或server 有什么结果?

(2)执行一个server程序,多次执行client有什么结果?

(3)消息机制与管道通信的区别?

在消息机制中,进程间的数据交换是以格式化的message为单位,程序员直接利用操作系统提供的一组通信命令,不仅能实现大量的数据传递,而且还是隐藏通信细节,是通信过程对用户透明,减少通信程序的复杂性。当今流行的微内核操作系统中,微内核与服务器间的通信都采用了消息机制。

管道,是指连接一个读进程和写进程以实现他们之间通信的一个共享文件。向管道提供输入的发送进程,以字符流形式将大量数据送入管道;而接受管道输出的接收进程,从管道中接收数据。管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个进程为写进程,另一个进程为读进程。写进程通过写端(发送端)往管道文件中写入信息;读进程通过读端(接收端)从管道文件中读取信息。两个进程协调不断地进行写、读,便会构成双方通过管道传递信息的流水线。

消息通信方式以消息缓冲区为中间介质,通信双方的发送和接收操作均以消息为单位。在存储器中,消息缓冲区被组织成队列,通常称之为消息队列。

创建消息队列用系统调用MSGGET()来实现,这一步工作也被称为消息队列的初始化。在进行通信时,消息队列的发送和接收分别用系统调用MSGSND()和MSGRCV()来实现。在需要改变队列的使用权限及其它一些特性时,用MSGCTL()来实现。

四、 实验分析与总结

通过这次实验了解了Unix的消息机制,并独自编程实现了消息的创建发送与接收,这对我对于消息的理解,乃至进程的调用相关知识的掌握都很有帮助。虽然在实验中遇到了不少的困难,尤其对于参考程序的理解,以及相关函数功能,以及系统内部实现问题上存在过迷惑,但是经过认真实践,渐渐清晰了消息机制的流程。虽然还有稍许的不明白,但是会在今后进一步的尝试中弥补。


西北工业大学-操作系统实验报告-实验七.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:深圳市设计评标专家培训资料(全套2)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: