05.Posix消息队列

1、概述

消息队列可认为是一个消息链表。有足够写权限的线程可往队列中放置消息,有足够读权限的线程可从队列中取走消息。每个消息都是一个记录,它由发送者赋予一个优先级。在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。这跟管道和FIFO是相反的,对后两者来说,除非读出者已存在,否则先有写入者是没有意义的。

一个进程可以往某个队列写入一些消息,然后终止,再让另外一个进程在以后某个时刻该出这些消息。我们说过消息队列具有随内核的持续性,这跟管道和FIFO不一样。当一个管道或FIFO的最后一次关闭发生时,仍在该管道或FIFO上的数据将被丢弃。

Posix消息队列与System V消息队列,这两组函数间存在许多相似性,下面是主要的差别。

  • 对Posix消息队列的读总是返回最高优先级的最早消息,对System V消息队列的读则可以返回任意指定优先级的消息
  • 当往一个空队列放置一个消息时,Posix消息队列允许产生一个信号或启动一个线程,System V消息队列则不提供类似机制。

队列中的每个消息具有如下属性:

  • 一个无符号整数优先级(Posix)或一个长整数类型(System V);
  • 消息的数据部分长度(可以为0);
  • 数据本身(如果长度大于0)。

 

2、mq_open、mq_close 和 mq_unlink 函数

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

#include <mqueue.h>
mqd_t mq_pen(const char *name, int oflag, ...
    	/* mode_t mode, struct mq_attr *attr */);
            	// 返回:若成功则为消息队列描述符,若出错则为 -1

name:需要符合IPC命名规则。便于移植,必须以一个斜杠符打头,且不能再包含如何斜杠符。

oflag:参数是O_RDONLY、O_WRONLY 或 0_RDWR之一,可能按位或上O_CREAT、O_EXCL或O_NONBLOCK。

 

mq_close 关闭已打开的消息队列。

#include <mqueue.h>
int mq_close(mqd_t mqdes);
                // 返回:若成功则为0,若出错则为-1

其功能与关闭一个已打开文件的close函数类似:调用进程可以不再使用该描述符,但其消息队列并不从系统中删除。一个进程终止时,它的所有打开着的消息队列都关闭,就像调用了mq_close一样。

 

mq_unlink从系统中删除用作mq_open第一个参数的某个name。

#include <mqueue. h>
int mq_unlink(const char *name);
            // 返回:若成功则为0,若出错则为-1

2.1、例子:mqcreate1 程序

// pxmsg/mg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值