




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验八 消息队列w实验目的实验目的加深对进程概念的理解,明确进程和程序的区别、进一步认识并发执行的实质了解并熟悉Linux系统中利用消息队列实现进程通信的基本概念及方法熟悉Linux提供的有关系统调用函数/库函数,并能使用这些函数w实验准备及预习实验准备及预习阅读讲义附件9-消息队列,了解Linux系统中利用消息队列实现进程通信的基本概念及方法熟悉Linux提供的有关系统调用函数/库函数:msgget()、msgsnd()、msgrcv()、msgctl() w消息队列提供了一种在两个进程之间传递数据的简单且有效的方法与命名管道相比,它独立于发送/接收进程而存在,消除了同步命名管道打开/关闭时
2、可能产生的一些困难w消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法;每个数据块都有一个类型标识,接收进程可独立地接收不同类型的数据块w消息队列存在于系统内核中,每个消息队列的容量(所能容纳的字节数)都有限制,该值因系统不同而不同基本概念消息队列的创建#includeint msgget(key_t key,int msgflg);功能:创建一个消息队列或取得一个已经存在的消息队列返回值:成功返回消息队列的标示符(ID),失败为-1参数:wkey:消息队列的键值,为IPC_PRIVATE时将创建一个只能被创建进程读写的消息队列;若不是IPC_PRIVATE,则可指定某个整数值,还可
3、以用ftok ()函数来获得一个唯一的键值wmsgflg:创建消息队列的创建方式或权限:IPC_CREAT,如果内存中不存在指定消息队列,则创建一个消息队列,否则取得该消息队列例1:使用函数msgget()创建一个消息队列#include#include#include#define MYMSG_KEY 75int main()int msgid;msgid=msgget(MYMSG_KEY,IPC_CREAT | 0644);printf(msgid=%dn,msgid);if(msgid=-1)perror(msgget error :);exit(EXIT_FAILURE);return
4、 0;可用ipcs -q 来查看是否创建成功用ipcrm q msgid删除指定消息队列#includeint msgsnd(int msgid,struct msgbuf *msgp ,int msgsz, int msgflg);功能:往队列中发送一个消息返回值:成功返回0,失败返回-1参数:wmsgid:消息标识id,也就是msgget()函数的返回值wmsgp:指向消息缓冲区的指针,该结构体为struct mymesg long mtype; /*消息类型*/char mtext512; /*消息文本*/wmsgsz:消息文本的大小,不包含消息类型(4个字节)wmsgflg:可以设置为
5、0,或者IPC_NOWAIT。为0,调用进程会被挂起,直到消息写到消息队列为止发送消息/ write messages to msg queuemsg_send.mtype=1;printf(enter a message:n);scanf(“%s”,buf);/ 输入字符串不能包含空格strcpy(msg_send.mtext,buf);ret=msgsnd(msgid,&msg_send,strlen(msg_send.mtext)+1,0);if(ret=-1)perror(msgget error: );exit(EXIT_FAILURE);return 0; 例2:利用函数msgsn
6、d()向指定消息队列发送消息#include #include#include#include#define MYMSG_KEY 75struct mymesg long mtype; /* 消息类型*/char mtext512; /* 消息文本*/ ;int main()int msgid,ret;char buf25;struct mymesg msg_send;msgid=msgget(MYMSG_KEY,IPC_CREAT | 0644);printf(msgid=%dn,msgid);if(msgid=-1)perror(msgget error :);exit(EXIT_FAIL
7、URE); 运行程序两次,写入2个消息 读消息#includeint msgrcv(int msgid , struct msgbuf *msgp,int msgsz , long mtype,int msgflg ); 功能:从消息队列中读走消息返回值:成功返回0,失败返回-1参数:wmsgid:消息队列的id号wmsgp:存储读取到的消息的地址wmsgsz:消息的长度,不包含mtypewmtype :从消息队列中读取的消息的类型,为0则会读取写入队列的第一条消息wmsgflg:为0时表示该进程将一直阻塞,直到有消息可读例3:利用函数msgrcv()把刚才写的2个消息读取出来#include
8、#include#include#include#define MYMSG_KEY 75struct mymesg long mtype; char mtext512;int main() int msgid, ret;char buf25;struct mymesg msg_rcv;msgid=msg(MYMSG_KEY,IPC_CREAT | 0644);printf(msgid=%dn,msgid);if(msgid=-1)perror(msgget error :);exit(EXIT_FAILURE); /read mseeags from msg queueret=msgrcv(m
9、sgid,&msg_rcv, sizeof(struct msg_rcv)-sizeof(long),1,0);/读到的消息放到msg_rcv中if(ret=-1)perror(msgrcv error:);exit(EXIT_FAILURE);printf(received msg from queue : %sn,msg_rcv.mtext);return 0;运行结果(执行两次,把前一个程序运行时写入消息队列的两个消息都读出来)消息队列处理#includeint msgctl(int msgid, int cmd ,struct msgqid _ds *buf);功能:对消息队列的控制处
10、理,比如删除消息队列、获取消息队列的详细信息、改变消息队列的信息等返回值:成功返回0,失败返回-1参数:wmsgid:消息队列的ID,即函数msgget()的返回值wcmd:消息队列的处理命令IPC_RMID:从系统内核中删除消息队列,相当于在终端输入命令“ipcrm -q id”IPC_STAT:获取消息队列的详细消息,包含权限、各种时间、id等IPC_SET:设置消息队列的信息wbuf:存放消息队列状态的结构体的地址#include#include#include#include#define MYMSG_KEY 75int main() int msgid,msgctl_ret;msgi
11、d=msgget(MYMSG_KEY,IPC_CREAT | 0644);printf(msgid=%dn,msgid);if(msgid=-1)perror(msgget error :);exit(EXIT_FAILURE);/delete queue msgctl_ret = msgctl(msgid,IPC_RMID,0);if(msgctl_ret=-1)perror(msgctl error :);exit(EXIT_FAILURE);printf(deleted queue %d ok.n ,msgid);return 0;补充 进程间通信机制IPCwUNIX System V版
12、本设计了一个进程间通信的机制,后来被称为System V IPC,它解决了UNIX早期版本在进程间通信方面的弱点UNIX早期版本中大批量数据只能通过pipe来传递,而pipe只能在调用它的进程及其子孙间传递信息虽然有名管道能实现非同族进程之间的相互通信,但不能复用有名管道以便为多对通信进程提供私有通道,即有名管道不能识别其通信伙伴,也不能优选地接收信息wSystem V IPC机制有效地解决了这些弱点,Linux则完整地继承了System V IPCwSystem V IPC有三个组成部分:消息(message)用于进程之间传递分类的格式化数据共享存储区(shared memory)方式可使得
13、不同进程通过共享彼此的虚拟空间而达到对共享区操作和数据通信的目的信号量(semaphone)机制用于通信进程之间的同步控制。信号量通常与共享存储区方式一起使用。w由于三个方式都是作为一个整体实现的,因此它们具有下述共同性质消息队列综合例w使用系统调用msgget()、msgsnd()、msgrcv()、msgctl()编写消息发送和接收程序,消息长度为1K。功能分析如下:用一个程序作为“引子”,fork()两个子进程:SERVER和CLIENT,进行通信;在SERVER端建立一个key为75的消息队列,等待其他进程发来的消息;以类型为1的消息作为结束信号,遇到该信号时取消消息队列,并退出SER
14、VER。SERVER每接收到一条消息后显示“(server)received”;CLIENT端建立一个key为75为的消息队列,先后发送类型从10到1的消息,然后退出。最后一个消息即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示“(client) sent”;父进程在SERVER和CLIENT结束后结束。#include #include #include #include #define MSGKEY 75 /*定义消息队列关键字*/struct msgform /* 定义消息结构*/ long mtype; char mtext1030; /*消息文本长度*/msg;in
15、t msgqid;void CLIENT() int i; msgqid=msgget(MSGKEY,0777); for(i=10;i=1;i-) msg.mtype=i; printf(client) sentn); msgsnd(msgqid,&msg,1024,0);/*发送消息msg到msgqid消息队列*/ exit(0);void SERVER() msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*由关键字获得消息队列*/ domsgrcv(msgqid,&msg,1030,0,0);/*从msgqid队列接收消息msg*/ printf(server) receivedn); while(msg.mtype!=1); /*消息类型为1时,释放队列*/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产品服务购销合同范例
- 住宅物业前期合同范例
- 员工j就职合同范本
- 买房交订金合同范本
- 刑事代理诉讼合同范本
- 合同范例几个部分
- 个人购买古董合同范本
- 关于医院合作合同范本
- 兵团劳动合同范本
- 单位修建公路合同范本
- 医学教材成人高尿酸血症与痛风食养指南(2024年版)解读课件
- 金川集团股份有限公司招聘笔试题库2024
- 小学数学北师大版三年级下长方形的面积教案
- 2024年全国职业院校技能大赛高职组(中药传统技能赛项)考试题库(含答案)
- DGJ32 J 67-2008 商业建筑设计防火规范
- 2024年上海交通大学招考聘用高频考题难、易错点模拟试题(共500题)附带答案详解
- 浙江省金华市2024年初中毕业升学适应性检测 科学试题卷
- 延长石油招聘笔试试题
- DB-T 29-22-2024 天津市住宅设计标准
- 2024年赣州职业技术学院单招职业适应性测试题库及答案解析
- DL∕T 5209-2020 高清版 混凝土坝安全监测资料整编规程
评论
0/150
提交评论