您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 西北工业大学-操作系统实验报告-实验七
实验七消息及其传送机制一、实验目的(1)了解什么是消息。(2)熟悉消息传送的机理。二、实验内容与要求1、消息的创建、发送和接收。使用系统调用msgget(),msgsnd(),msgrev(),及msgctl()编制一长度为256Bytes的消息发送和接收的程序,将自己的进程号传递给对方,并输出至屏幕。2、对整个实验过程进行分析总结,给出详细步骤。三、实验过程1、编写程序实现消息的创建、发送和接收。将参考程序用vi编辑器录入,然后编译执行。1、client.c#includeunistd.h#includestdio.h#includesys/types.h#includesys/ipc.h#includesys/msg.h#defineMSGKEY75/*定义一个消息关键字*/structmsgform/*定义一个结构,它是一个消息的模式,只说明结构的形式*/{longmtype;/*消息类型*/charmtext[256];/*消息正文数组*/};intmain(){{structmsgformmsg;/*定义msg是前面说明的消息结构类型的变量*/intmsggid,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:receivefrompid%d\n”,*pint);return0;}2、server.c#includeunistd.h#includestdio.h#includestdlib.h#includesignal.h#includesys/types.h#includesys/ipc.h#includesys/msg.h#defineMSGKEY75/*定义一个消息关键字*/structmsgform/*定义一个与客户端相同的消息关键字*/{longmtype;/*消息类型*/charmtext[256];/*消息正文数组*/}msg;/*也可以使用这种方式说明消息结构变量*/voidcleanup(intsigno);/*说明一个外部函数*/intmsgqid;intmain(){inti,pid,*pint;for(i=0;i23;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:receivefrompid%d\n”,pid);msg.mtype=pid;/*已接受客户进程的pid为消息类型*/*pint=getpid();/*以本进程pid作为消息构成消息传递内容*/msgsnd(msggid,&msg,sizeof(int),0);/*发送消息*/}}voidcleanup(intsigno){msgctl(msggid,IPC_RMID,0);/*删除消息队列*/exit(0);}如下图所示:client.cserver.c运行结果如下所示:2、思考题(1)单独执行client或server有什么结果?(2)执行一个server程序,多次执行client有什么结果?(3)消息机制与管道通信的区别?在消息机制中,进程间的数据交换是以格式化的message为单位,程序员直接利用操作系统提供的一组通信命令,不仅能实现大量的数据传递,而且还是隐藏通信细节,是通信过程对用户透明,减少通信程序的复杂性。当今流行的微内核操作系统中,微内核与服务器间的通信都采用了消息机制。管道,是指连接一个读进程和写进程以实现他们之间通信的一个共享文件。向管道提供输入的发送进程,以字符流形式将大量数据送入管道;而接受管道输出的接收进程,从管道中接收数据。管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个进程为写进程,另一个进程为读进程。写进程通过写端(发送端)往管道文件中写入信息;读进程通过读端(接收端)从管道文件中读取信息。两个进程协调不断地进行写、读,便会构成双方通过管道传递信息的流水线。消息通信方式以消息缓冲区为中间介质,通信双方的发送和接收操作均以消息为单位。在存储器中,消息缓冲区被组织成队列,通常称之为消息队列。创建消息队列用系统调用MSGGET()来实现,这一步工作也被称为消息队列的初始化。在进行通信时,消息队列的发送和接收分别用系统调用MSGSND()和MSGRCV()来实现。在需要改变队列的使用权限及其它一些特性时,用MSGCTL()来实现。四、实验分析与总结通过这次实验了解了Unix的消息机制,并独自编程实现了消息的创建发送与接收,这对我对于消息的理解,乃至进程的调用相关知识的掌握都很有帮助。虽然在实验中遇到了不少的困难,尤其对于参考程序的理解,以及相关函数功能,以及系统内部实现问题上存在过迷惑,但是经过认真实践,渐渐清晰了消息机制的流程。虽然还有稍许的不明白,但是会在今后进一步的尝试中弥补。
本文标题:西北工业大学-操作系统实验报告-实验七
链接地址:https://www.777doc.com/doc-4892759 .html