Linux消息队列讲解

消息队列

一、消息队列

1. 消息队列是消息的链表,存放在内存中,由内核维护

2. 特点

1)消息队列允许一个或多个进程向它写入或者读取消息,并且每条消息都有类型

2)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取。

3)与无名管道、有名管道一样,从消息队列中读出消息,消息队列中数据会被删除。

4)消息队列中的消息是有格式的。

5)只有内核重启或人工删除时,该消息才会被删除,若不人工删除消息队列,消息队列会一直存在于内存中

6)消息队列标识符,来标识消息队列。消息队列在整个系统中是唯一的。

7)在Linux操作系统中消息队列限制值如下:

  消息队列个数最多为16个

  消息队列总容量最多为16384字节

  每个消息内容最多为8192字节

3. System V提供的IPC通信机制需要一个key值,通过key值就可在系统内获得一    个唯一的消息队列ID。

4. key值可以是人为指定的,如(key_t)1234;也可以通过ftok函数获得,如。

5. ftok函数

#include

#include

key_t ftok(const char *pathname, int proj_id)

功能:

    获得项目相关的唯一的IPC键值。

参数:

    pathname:路径名

    proj_id:项目ID,非0整数(只有低8位有效)

返回值:

    成功返回key值

    失败返回 -1。

6.消息队列的消息的格式。

typedef struct _msg

{

    long mtype; /*消息类型*/

    char mtext[100];/*消息正文*/

    ... /*消息的正文可以有多个成员*/

}MSG;

消息类型必须是长整型的,而且必须是结构体类型的第一个成员,类型下面是消息正文,正文可以有多个成员(正文成员可以是任意数据类型的)。

7.使用shell命令操作消息队列:

    查看消息队列    ipcs -q

    删除消息队列    ipcrm -qmsqid

8.创建消息队列:

#include

int msgget(key_t key, int msgflg)

功能:

    创建一个新的或打开一个已经存在的消息队列。

    不同的进程调用此函数,只要用相同的key值就能得到,

    同一个消息队列的ID。

参数:

    key:IPC键值

    msgflg:标识函数的行为:

        IPC_CREAT(创建)或

        IPC_EXCL(如果已经存在则返回失败)。

返回值:

    成功:消息队列的标识符

    失败:返回-1。

9.发送消息:

#include

int msgsnd(int msqid, const void *msgp,size_t msgsz,int msgflg);

功能:

    将新消息添加到消息队列。

参数:

msqid:消息队列的队列ID。

msgp:待发送消息结构体的地址。

msgsz:消息正文的字节数。

msgflg:函数的控制属性

0:msgsnd调用阻塞直到条件满足为止。

IPC_NOWAIT:若消息没有立即发送则调用该函数的进程会立即返回。

返回值:

    成功:0

    失败:返回-1。

10.接收消息:

#include

ssize_t msgrcv(int msqid, void *msgp,size_tmsgsz,long msgtyp, int msgflg);

功能:

从ID为msqid的消息队列中接收一个消息。一旦接收消息成功,则消息在消息队列中被删除。

参数:

  msqid:消息队列的ID,代表要从哪个消息列中获取消息。

  msgp:存放消息结构体的地址。

  msgsz:消息正文的字节数。

  msgtyp:消息的类型、可以有以下几种类型

  msgtyp= 0:返回队列中的第一个消息

  msgtyp > 0:返回队列中消息类型为msgtyp的消息

  msgtyp< 0:返回队列中消息类型值小于或等于msgtyp绝对值的消息,如果这种消息有若干个,则取类型值最小的消息

msgflg:函数的控制属性

0:msgrcv调用阻塞直到接收消息成功为止。

MSG_NOERROR:若返回的消息字节数比nbytes字节数多,则消息就会截短到nbytes字节,且不通知消息发送进程。

IPC_NOWAIT:调用进程会立即返回。若没有收到消息则立即返回-1。

注意:

    若消息队列中有多种类型的消息,msgrcv获取消息的时候按消息类型获取,不是先进先出的。

    在获取某类型消息的时,若队列中有多条此类型的消息,则获取最先添加的消息,即先进先出原则

返回值:

    成功返回读取消息的长度

    失败返回-1。

11.消息队列的控制

#include

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

功能:

    对消息队列进行各种控制,如修改消息队列的属性,或删除消息消息队列。

参数:

    msqid:消息队列的ID

    cmd:函数功能的控制

IPC_RMID:删除由msqid指示的消息队列,将它从系统中删除并破坏相关数据结构。

IPC_STAT:将msqid相关的数据结构中各个元素的当前值存入到由buf指向的结构中。

IPC_SET:将msqid相关的数据结构中的元素设置为由buf指向的结构中的对应值。

    buf:msqid_ds数据类型的地址,用来存放或更改消息队列的属性。

返回值:

    成功:返回0;

    失败:返回 -1

12.消息队列实现进程间通信:消息队列实现两个不相干进程通信


你可能感兴趣的:(Linux)