您的当前位置:首页正文

消息队列

来源:画鸵萌宠网


消息队列

一.实验目的

1. 在linux中如何创建消息队列。

2. 学习linux进程间如何通过消息队列进行通信。 二.准备知识 1. 消息队列

消息队列就是一个消息链表,可把消息看成一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按一定的规则添加新消息;对消息队列有读权限的进程可从消息队列中读走消息。消息允许进程发送格式化的数据流到任意的进程。 2. 操作消息队列

(1) 打开或创建消息队列

每个消息队列都在系统范围内对应唯一键值,要获得一个消息队列的描述字,只需提供该消息队列的键值。 (2) 读写操作

消息读写操作简单,每个消息都有类型如下数据结构

mtype:代表消息类型。从消息队列中读取消息的一个重要依据是消息类型。

mtext:代表消息内容。对发送消息,预先设置一个msgform缓冲区并写入消息类型和内容,调用相应的发送函数可;对读取消息,先分配一个msgform缓冲区,然后把消息读入该缓冲区即可。

(3)获得或设置消息队列属性

消息队列的信息基本上都保存在消息队列头中,故可分配一个类似于消息队列头的结构(struct msgid_ds),来返回消息队列的属性。 3.相关系统调用

头文件

A.

(1) 系统调用msgget

int msgget(key_t key, int msgflg); 含义:返回(创建)一个消息队列描述符,该描述符指定一个消息队列以便于其他系统调用,该调用返回与key相对应的消息队列描述字。

参数说明:

key:消息队列关联的键。

msgflg:参数是一些标志位,其值可以是IPC_CREAT,IPC_EXCL, IPC_NOWAIT或三者的或情况。消息队列的建立标志和存取权限。

B. 消息队列被建立的情况有两种: a.如果键key的值是IPC_PRIVATE。

b.或者键值key不是IPC_PRIVATE,并且键所对应的消息队列不存在,同时msgflg指定IPC_CREAT标志位。

C.返回说明:

成功执行时,返回消息队列标识值。失败返回-1,errno被设为以下的某个值

EACCES:指定的消息队列已存在,但调用进程没有权限访问它,而且不拥有CAP_IPC_OWNER权能 EEXIST:key指定的消息队列已存在,而msgflg中同时指定IPC_CREAT和IPC_EXCL标志 ENOENT:key指定的消息队列不存在同时msgflg中不指定IPC_CREAT标志 ENOMEM:需要建立消息队列,但内存不足

ENOSPC:需要建立消息队列,但已达到系统的限制

(2) 系统调用msgctl

int msgctl(msqid, cmd, mstatbuf) A. 参数说明:

msqid:标识该消息队列描述符。 cmd:规定命令的类型。

mstatbuf:含有控制参数或查询结果的用户数据结构的地址。 B. 函数说明:

该系统调用对由msgid标识的消息队列指向cmd操作,有三种:

a. IPC_STAT: 获取消息队列信息,返回的信息存储在mstatbuf指向的msgid结构中。 b. IPC_SET:设置消息队列的属性,要设置的属性存储在mstatbuf指向的msgid结构中。 c. IPC_RMID:删除msgid标识的消息队列。

(3) 系统调用msgsnd

int msgsnd( msgid, msgp, msgsz, msgflg);

说明:向msgid代表的消息队列发送一个消息,即将发送的消息存储在msg指向

含义:向消息队列中写自己的PID. (client。c进程中) 含义:向消息队列中发送自己的PID. (server。c进程中) A. 参数说明:

msgid:由msgget返回的一个消息队列的描述符,int型。

msgp: 指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下

struct msgbuf {

long mtype; /* 消息类型,必须 > 0 */ char mtext[1]; /* 消息文本 */ }; msgsz:消息的大小,即数据数组大小。

msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。

B.

函数说明:

向msgid代表的消息队列发送一个消息,即将发送的信息存储在msgp指向的msgbuf结构中,消息大小由msgsz指定。对发送消息来说,有意义的msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会立即返回-1,当msgflg为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取阻塞等待的处理模式。

C. 返回说明:

成功执行时,msgsnd()返回0, 失败返回-1

(4) 系统调用msgrcv

ssize_t msgrcv (int msqid, void *msgp, size_t nbytes, long msgtyp, int msgflg)

msgrcv ()函数作用是:系统调用从msgid代表的消息队列中读取消息,把接收到的消息存储到msgp指针指向的缓冲区msgbuf

中,nbytes表示缓冲支持的消息字节数。发送和接收消息中的msqid是消息队列描述符,用来标识相关的消息队列。

含义:接收client。C写到消息队列中的数据

含义:接收serve。C写到消息队列中的数据 A. 参数说明:

msgid:消息队列描述字。

msgp:消息返回后存储在msgp指向的地址。

nbytes:指定msgbuf的mtext成员的长度(即消息内容的长度)。 msgflg:为请求读取的消息类型,由以下几个常值的或:

IPC_NOWAIT:如果没有满足条件的信息,调用立即返回,此时,errno=ENOMSG. IPC_EXCEPT:与msgtyp>0配合使用,返回队列中第一个类型不为msgtyp的消息 4.程序截图:

因篇幅问题不能全部显示,请点此查看更多更全内容

Top